RevitAPI: 事务的错误或警告信息的处理 - Failure Processor of Transaction .
2016-02-25 13:16
656 查看
原文地址:http://blog.csdn.net/lushibi/article/details/41849487
很多时候,当我们提交一个事务的时候,Revit会弹出错误框或者警告框,而该错误或警告无法使用Try-Catch捕获。
[csharp]
view plain
copy
print?
using (Transaction transaction = new Transaction(RevitDoc))
{
try
{
transaction.Start("TransactionName");
// do your stuff
transaction.Commit();
}
catch (Exception ex)
{
if (transaction.GetStatus() == TransactionStatus.Started)
transaction.RollBack();
}
}
例如像下面的错误:
这个时候就要用到FailureProcessor了。
首先我们需要定义一个实现了接口IFailuresPreprocessor的类。
[csharp]
view plain
copy
print?
public class MyFailuresPreProcessor : IFailuresPreprocessor
{
private string _failureMessage;
private bool _hasError;
public string FailureMessage
{
get { return _failureMessage; }
set { _failureMessage = value; }
}
public bool HasError
{
get { return _hasError; }
set { _hasError = value; }
}
public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)
{
var failures = failuresAccessor.GetFailureMessages();
if (failures.Count == 0)
return FailureProcessingResult.Continue;
foreach (var failure in failures)
{
if (failure.GetSeverity() == FailureSeverity.Error)
{
_failureMessage = failure.GetDescriptionText(); // get the failure description
_hasError = true;
return FailureProcessingResult.ProceedWithRollBack;
}
if (failure.GetSeverity() == FailureSeverity.Warning)
{
failuresAccessor.DeleteWarning(failure);
}
}
return FailureProcessingResult.Continue;
}
}
这里通过PreprocessFailures方法我们就可以捕获错误或者警告,然后进行我们想要的处理。
FailuresAccessor.GetFailureMessages() 获取所有的失败信息
FailureMessageAccessor.GetSeverity() 可以得知它是警告还是错误
FailureMessageAccessor.GetDescriptionText() 可以获取错误的文字
FailureMessageAccessor.GetFailureDefinitionId() 获取失败的定义
FailuresAccessor.DeleteWarning删除警告,或者FailuresAccessor.DeleteAllWarnings直接删除所有警告
然后在Transaction类里面设置FailuresPreprocessor,使用FailureHandlingOptions options = transaction.GetFailureHandlingOptions();
获取FailureHandlingOptions,然后使用options.SetFailuresPreprocessor(IFailuresPreprocessor)来设置FailuresPreprocessor。
代码如下:
[csharp]
view plain
copy
print?
using (Transaction transaction = new Transaction(RevitDoc))
{
try
{
transaction.Start(<
4000
span class="string">"TransactionName");
FailureHandlingOptions options = transaction.GetFailureHandlingOptions();
MyFailuresPreProcessor failureProcessor = new MyFailuresPreProcessor();
options.SetFailuresPreprocessor(failureProcessor);
transaction.SetFailureHandlingOptions(options);
// do your operations
var status = transaction.Commit();
if (status != TransactionStatus.Committed)
{
if (failureProcessor.HasError)
{
TaskDialog.Show("ERROR", failureProcessor.FailureMessage);
}
}
}
catch (Exception ex)
{
if (transaction.GetStatus() == TransactionStatus.Started)
transaction.RollBack();
}
}
很多时候,当我们提交一个事务的时候,Revit会弹出错误框或者警告框,而该错误或警告无法使用Try-Catch捕获。
[csharp]
view plain
copy
print?
using (Transaction transaction = new Transaction(RevitDoc))
{
try
{
transaction.Start("TransactionName");
// do your stuff
transaction.Commit();
}
catch (Exception ex)
{
if (transaction.GetStatus() == TransactionStatus.Started)
transaction.RollBack();
}
}
例如像下面的错误:
这个时候就要用到FailureProcessor了。
首先我们需要定义一个实现了接口IFailuresPreprocessor的类。
[csharp]
view plain
copy
print?
public class MyFailuresPreProcessor : IFailuresPreprocessor
{
private string _failureMessage;
private bool _hasError;
public string FailureMessage
{
get { return _failureMessage; }
set { _failureMessage = value; }
}
public bool HasError
{
get { return _hasError; }
set { _hasError = value; }
}
public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)
{
var failures = failuresAccessor.GetFailureMessages();
if (failures.Count == 0)
return FailureProcessingResult.Continue;
foreach (var failure in failures)
{
if (failure.GetSeverity() == FailureSeverity.Error)
{
_failureMessage = failure.GetDescriptionText(); // get the failure description
_hasError = true;
return FailureProcessingResult.ProceedWithRollBack;
}
if (failure.GetSeverity() == FailureSeverity.Warning)
{
failuresAccessor.DeleteWarning(failure);
}
}
return FailureProcessingResult.Continue;
}
}
这里通过PreprocessFailures方法我们就可以捕获错误或者警告,然后进行我们想要的处理。
FailuresAccessor.GetFailureMessages() 获取所有的失败信息
FailureMessageAccessor.GetSeverity() 可以得知它是警告还是错误
FailureMessageAccessor.GetDescriptionText() 可以获取错误的文字
FailureMessageAccessor.GetFailureDefinitionId() 获取失败的定义
FailuresAccessor.DeleteWarning删除警告,或者FailuresAccessor.DeleteAllWarnings直接删除所有警告
然后在Transaction类里面设置FailuresPreprocessor,使用FailureHandlingOptions options = transaction.GetFailureHandlingOptions();
获取FailureHandlingOptions,然后使用options.SetFailuresPreprocessor(IFailuresPreprocessor)来设置FailuresPreprocessor。
代码如下:
[csharp]
view plain
copy
print?
using (Transaction transaction = new Transaction(RevitDoc))
{
try
{
transaction.Start(<
4000
span class="string">"TransactionName");
FailureHandlingOptions options = transaction.GetFailureHandlingOptions();
MyFailuresPreProcessor failureProcessor = new MyFailuresPreProcessor();
options.SetFailuresPreprocessor(failureProcessor);
transaction.SetFailureHandlingOptions(options);
// do your operations
var status = transaction.Commit();
if (status != TransactionStatus.Committed)
{
if (failureProcessor.HasError)
{
TaskDialog.Show("ERROR", failureProcessor.FailureMessage);
}
}
}
catch (Exception ex)
{
if (transaction.GetStatus() == TransactionStatus.Started)
transaction.RollBack();
}
}
相关文章推荐
- 70. Climbing Stairs
- 解决TIME_WAIT过多造成的问题
- sleep() 和 wait() 有什么区别?
- AIDL初探以及学习
- 收到的电邮附件为Winmail.dat?
- move_uploaded_file的failed to open stream错误处理
- move_uploaded_file的failed to open stream错误处理
- 错误提示:process launch failed: Security
- 淘汰人工的机器时代
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttr
- linxu 中大量的close_wait 和 time_wait 处理
- 217. Contains Duplicate
- AIX ERRPT日志查询
- RAID5磁盘阵列配置
- Could not obtain transaction-synchronized Session for current thread 异常处理方式
- User Agent String explained
- 报错:Conversion to Dalvik format failed: Unable to execute dex:
- 217. Contains Duplicate
- Does Daemon Thread Exit with Main Thread?
- Exchange2010使用 Export-Mailbox cmdlet 将邮箱的内容移动到指定的邮箱文件夹