RevitAPI: 事务的错误或警告信息的处理 - Failure Processor of Transaction .

本文介绍了在Revit事务处理中遇到错误或警告时,如何使用FailureProcessor类来捕获并处理这些错误或警告。通过实现IFailuresPreprocessor接口,自定义FailureProcessor类,可以捕获错误或警告信息,并进行相应的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://blog.youkuaiyun.com/lushibi/article/details/41849487

很多时候,当我们提交一个事务的时候,Revit会弹出错误框或者警告框,而该错误或警告无法使用Try-Catch捕获。

  1. using (Transaction transaction = new Transaction(RevitDoc))  
  2. {  
  3.     try  
  4.     {  
  5.         transaction.Start("TransactionName");  
  6.         // do your stuff   
  7.         transaction.Commit();  
  8.     }  
  9.     catch (Exception ex)  
  10.     {  
  11.         if (transaction.GetStatus() == TransactionStatus.Started)  
  12.             transaction.RollBack();  
  13.     }  
  14. }  
例如像下面的错误:

这个时候就要用到FailureProcessor了。

首先我们需要定义一个实现了接口IFailuresPreprocessor的类。

  1. public class MyFailuresPreProcessor : IFailuresPreprocessor  
  2. {  
  3.     private string _failureMessage;  
  4.     private bool _hasError;  
  5.     public string FailureMessage  
  6.     {  
  7.         get { return _failureMessage; }  
  8.         set { _failureMessage = value; }  
  9.     }  
  10.     public bool HasError  
  11.     {  
  12.         get { return _hasError; }  
  13.         set { _hasError = value; }  
  14.     }  
  15.     public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)  
  16.     {  
  17.         var failures = failuresAccessor.GetFailureMessages();  
  18.         if (failures.Count == 0)  
  19.             return FailureProcessingResult.Continue;  
  20.   
  21.         foreach (var failure in failures)  
  22.         {  
  23.             if (failure.GetSeverity() == FailureSeverity.Error)  
  24.             {  
  25.                 _failureMessage = failure.GetDescriptionText(); // get the failure description  
  26.                 _hasError = true;  
  27.                 return FailureProcessingResult.ProceedWithRollBack;  
  28.             }  
  29.             if (failure.GetSeverity() == FailureSeverity.Warning)  
  30.             {  
  31.                 failuresAccessor.DeleteWarning(failure);  
  32.             }  
  33.         }  
  34.   
  35.         return FailureProcessingResult.Continue;  
  36.     }  
  37. }  

这里通过PreprocessFailures方法我们就可以捕获错误或者警告,然后进行我们想要的处理。

  • FailuresAccessor.GetFailureMessages() 获取所有的失败信息
  • FailureMessageAccessor.GetSeverity() 可以得知它是警告还是错误
  • FailureMessageAccessor.GetDescriptionText() 可以获取错误的文字
  • FailureMessageAccessor.GetFailureDefinitionId() 获取失败的定义
  • FailuresAccessor.DeleteWarning删除警告,或者FailuresAccessor.DeleteAllWarnings直接删除所有警告

然后在Transaction类里面设置FailuresPreprocessor,使用FailureHandlingOptions options = transaction.GetFailureHandlingOptions();
获取FailureHandlingOptions,然后使用options.SetFailuresPreprocessor(IFailuresPreprocessor)来设置FailuresPreprocessor。

代码如下:

  1. using (Transaction transaction = new Transaction(RevitDoc))  
  2. {  
  3.     try  
  4.     {  
  5.         transaction.Start("TransactionName");  
  6.         FailureHandlingOptions options = transaction.GetFailureHandlingOptions();  
  7.         MyFailuresPreProcessor failureProcessor = new MyFailuresPreProcessor();  
  8.         options.SetFailuresPreprocessor(failureProcessor);  
  9.         transaction.SetFailureHandlingOptions(options);  
  10.         // do your operations   
  11.         var status = transaction.Commit();  
  12.         if (status != TransactionStatus.Committed)  
  13.         {  
  14.             if (failureProcessor.HasError)  
  15.             {  
  16.                 TaskDialog.Show("ERROR", failureProcessor.FailureMessage);  
  17.             }  
  18.         }  
  19.     }  
  20.     catch (Exception ex)  
  21.     {  
  22.         if (transaction.GetStatus() == TransactionStatus.Started)  
  23.             transaction.RollBack();  
  24.     }  
  25. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值