Building Coder(Revit 二次开发) - 失败回滚(Failure Rollback)

本文介绍如何在Revit外部命令中实现失败处理,禁止警告消息框,忽略导致警告的操作,同时记录所有失败并在事务结束后通知用户。
原文链接: Failure Rollback


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


问题

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


我的问题场景如下:

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

回答

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


首先定义一个失败处理类:
public class FailureHandler : IFailuresPreprocessor
{
  public string ErrorMessage { set; get; }
  public string ErrorSeverity { set; get; }
 
  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;
  }
}

然后在创建事务的时候按照如下方式指定失败处理设置:
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、付费专栏及课程。

余额充值