REVIT二次开发 系统错误处理

下面文字转载自审什空间


在一个连续的事务中回滚失败的单个操作,并且禁止所有失败消息框(包括警告和错误)


问题

我试图实现一个失败处理函数:禁止所有警告消息框并撤销导致警告的操作。不过我找不到办法禁止那些不是警告的消息框。


我的问题场景如下:

在一个外部命令里创建多个Revit元素。这个过程可能在中途因为某种原因而失败。但是我不希望每次失败都弹出一个对话框让用户选择继续还是退出。我希望程序忽略掉导致失败的那部分操作,继续之后的操作。不过我需要记录下所有发生的失败,并且在整个外部命令结束时让用户知道发生了什么。

回答

解决办法里需要两个特殊的语句
- 在失败处理函数中返回 FailureProcessingResult.ProceedWithRollBack;
- 对事务失败处理设置调用 failureHandlingOptions.SetClearAfterRollback(true);


首先定义一个失败处理类:
[csharp]  view plain copy

public class FailureHandler : IFailuresPreprocessor  

{  

  public string ErrorMessage { setget; }  

  public string ErrorSeverity { setget; }  

   

  public FailureHandler()  

  {  

    ErrorMessage = "";  

    ErrorSeverity = "";  

  }  

   

  public FailureProcessingResult PreprocessFailures( FailuresAccessor failuresAccessor )  

  {  

    IList<FailureMessageAccessor> failureMessages = failuresAccessor.GetFailureMessages();  

   

    foreach( FailureMessageAccessor failureMessageAccessor in failureMessages )  

    {  

      // We're just deleting all of the warning level   

      // failures and rolling back any others  

   

      FailureDefinitionId id = failureMessageAccessor.GetFailureDefinitionId();  

   

      try  

      {  

        ErrorMessage = failureMessageAccessor.GetDescriptionText();  

      }  

      catch  

      {  

        ErrorMessage = "Unknown Error";  

      }  

   

      try  

      {  

        FailureSeverity failureSeverity = failureMessageAccessor.GetSeverity();  

   

        ErrorSeverity = failureSeverity.ToString();  

   

        if( failureSeverity == FailureSeverity.Warning )  

        {  

          // 如果是警告,则禁止消息框  

          failuresAccessor.DeleteWarning( failureMessageAccessor );  

        }  

        else  

        {  

          // 如果是错误:则取消导致错误的操作,但是仍然继续整个事务  

          return FailureProcessingResult.ProceedWithRollBack;  

        }  

      }  

      catch   

      {  

      }  

    }  

    return FailureProcessingResult.Continue;  

  }  

}  


然后在创建事务的时候按照如下方式指定失败处理设置:
[csharp]  view plain copy

Transaction transaction = new Transaction( doc );  

   

FailureHandlingOptions failureHandlingOptions = transaction.GetFailureHandlingOptions();  

FailureHandler failureHandler = new FailureHandler();  

failureHandlingOptions.SetFailuresPreprocessor( failureHandler );  

// 这句话是关键  

failureHandlingOptions.SetClearAfterRollback( true );  

transaction.SetFailureHandlingOptions( failureHandlingOptions );  

  

  

transaction.Start( "Transaction Name" );  

// Do something here that causes the error  

// ......  

transaction.Commit();  

  

  

// 这段代码只是简单地用一个 WinForm 对话框显示在失败处理函数中保存的失败记录。  

// 你可以在实际应用中对这些失败记录做任何处理。  

if( failureHandler.ErrorMessage != "" )  

{  

System.Windows.Forms.MessageBox.Show( failureHandler.ErrorSeverity + " || " + failureHandler.ErrorMessage );  

}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值