[英]Catch Exception, add data, and rethrow it
我有以下代码:
try
{
OnInitialize();
}
catch (PageObjectLifecycleException exception)
{
exception.OldLifecycleState = CurrentLifecycleState;
exception.RequestedLifecycleState = LifecycleState.Initialized;
throw exception;
}
我捕获一个异常,向它添加更多数据,然后重新抛出它。 Resharper警告我(正确地)可能需要重新抛出并建议将其更改为:
throw;
但我想知道:这是否正确地重新修改了修改后的异常或未经修改的原始异常?
编辑 :回应“试一试”评论:我是C#的新手,来自C ++。 在C ++中,你经常会在这样的极端情况下发现未定义的行为,我感兴趣的是我想要的是它是如何正式工作的。
您可以将额外信息添加到数据中并使用throw
重新抛出异常,以便保持其原始形式和callstack
try
{
...
}
catch (PageObjectLifecycleException exception)
{
exception.Data.Add("additional data", "the additional data");
throw;
}
我知道已经选择了答案但是这里有关于这个主题的更多信息。
try {
// code
}
catch(Exception e) {
throw e;
}
当编译成IL上面的代码将产生一个呼叫给throw
传递一个参考处理的异常作为参数。 您可能已经意识到,您可以从代码中的任何位置调用throw
来引发异常。
try {
// code
}
catch(Exception e) {
throw;
}
编译成IL时上面的代码将产生一个rethrow
的调用。 这是不同的,以throw
的rethrow
来的信号,在该异常被处理该块出于某种原因决定不处理它,因此,责任应给予高阶catch块(下一个了)。
rethrow
方法保留当前的调用堆栈跟踪,以便可以跟踪异常的来源。 但是, throw
方法启动一个新的调用堆栈跟踪。 一旦你理解了两种方法的用途,我认为这是有道理的。
根据我的经验,你使用throw exception;
当你想出于某种原因抛出异常时(例如对象的验证失败)你会使用throw;
在执行一些日志记录之后的catch语句中(即,在将异常处理职责传递到更高级别之前,您仍然可以访问验证失败的对象中的有用信息)。
在您的示例中,我建议如果您需要向异常添加更多信息,您可以创建一个全新的异常并提升它。 所以你会使用throw exception;
方法,其中“exception”是包含额外信息和最初抛出的异常的新异常。
希望有所帮助!
詹姆士
它将抛出对修改后的异常的引用。
但是我不确定这是不是很好的编程风格。 考虑创建一个新的异常并将PageObjectLifecycleException添加为其内部异常。 这样处理代码可以确定它是否具有正确的附加信息。
当前的异常被重新抛出,虽然我不确定你的模式是一个非常好的和可维护的模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.