繁体   English   中英

捕获异常,添加数据并重新抛出它

[英]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的调用。 这是不同的,以throwrethrow来的信号,在该异常被处理该块出于某种原因决定不处理它,因此,责任应给予高阶catch块(下一个了)。

rethrow方法保留当前的调用堆栈跟踪,以便可以跟踪异常的来源。 但是, throw方法启动一个新的调用堆栈跟踪。 一旦你理解了两种方法的用途,我认为这是有道理的。

根据我的经验,你使用throw exception; 当你想出于某种原因抛出异常时(例如对象的验证失败)你会使用throw; 在执行一些日志记录之后的catch语句中(即,在将异常处理职责传递到更高级别之前,您仍然可以访问验证失败的对象中的有用信息)。

在您的示例中,我建议如果您需要向异常添加更多信息,您可以创建一个全新的异常并提升它。 所以你会使用throw exception; 方法,其中“exception”是包含额外信息和最初抛出的异常的新异常。

希望有所帮助!

詹姆士

它将抛出对修改后的异常的引用。

但是我不确定这是不是很好的编程风格。 考虑创建一个新的异常并将PageObjectLifecycleException添加为其内部异常。 这样处理代码可以确定它是否具有正确的附加信息。

当前的异常被重新抛出,虽然我不确定你的模式是一个非常好的和可维护的模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM