C# 捕获异常、添加数据并重新显示它

C# 捕获异常、添加数据并重新显示它,c#,exception,C#,Exception,我有以下代码: try { OnInitialize(); } catch (PageObjectLifecycleException exception) { exception.OldLifecycleState = CurrentLifecycleState; exception.RequestedLifecycleState = LifecycleState.Initialized; throw exception; } 我捕获一个异常,向其中添加更多数据,然后

我有以下代码:

try
{
   OnInitialize();
}
catch (PageObjectLifecycleException exception)
{
   exception.OldLifecycleState = CurrentLifecycleState;
   exception.RequestedLifecycleState = LifecycleState.Initialized;
   throw exception;
}
我捕获一个异常,向其中添加更多数据,然后重新播放它。Resharper(正确地)警告我,可能打算重新播放,并建议将其更改为:

throw;
但我想知道:这会正确地重新显示修改过的异常还是未修改的原始异常


< > > >编辑< /强>:响应“尝试并查看”注释:我是C语言的新成员,从C++开始。在C++中,你经常会在这样的拐角情况下发现未定义的行为,我对我想要的是它如何正式工作感兴趣。

< p>它将引用引用到修改的异常。

try {
    // code
}
catch(Exception e) {
    throw;
}

然而,我不确定这是否是一种好的编程风格。考虑创建一个新的异常并添加PaulObjeLIFECyCyExcExchange作为其内部异常。通过这种方式,处理代码可以确定它是否包含正确的附加信息。

当前的异常将被重新抛出,尽管我不确定您的模式是否很好且可维护。

我知道已经选择了答案,但这里有关于该主题的更多信息

try {
    // code
}
catch(Exception e) {
    throw e;
}
上述代码在编译成IL时将生成对
throw
的调用,并将对已处理异常的引用作为参数传递。您可能知道,您可以从代码中的任何位置调用
throw
,以引发异常

try {
    // code
}
catch(Exception e) {
    throw;
}
上述代码编译成IL后将生成对
rethrow
的调用。这与
throw
不同,因为
rethrow
用于表示处理异常的块出于某种原因决定不处理异常,因此,应向更高阶的catch块(下一个)提供责任

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

根据我的经验,您使用
抛出异常当您出于某种原因(例如,对象验证失败)想要抛出异常时,您将使用
throw

在您的示例中,我建议,如果您需要向异常添加更多信息,您可以创建一个全新的异常并引发它。因此,您将使用
抛出异常方法,其中“异常”是一个新异常,包含额外信息和最初抛出的异常

try {
    // code
}
catch(Exception e) {
    throw;
}
希望有帮助


James

您可以将额外的信息添加到数据中,并使用
throw
重新抛出异常,以便它保持其原始形式和调用堆栈

try
{
   ...
}
catch (PageObjectLifecycleException exception)
{
   exception.Data.Add("additional data", "the additional data");
   throw;
}

尝试一下,看看会发生什么?它也会重新引用引用所指向的任何内容-在你的例子中是修改过的“异常”。我也是,这是一个真正的bug隐藏器。例如,外部catch块践踏从较深的块传回的数据。代码示例被简化。不会覆盖任何现有数据,只会提供一些缺少的附加数据。@TonyHopkinson
异常。数据
听起来应该就是为了这个目的()这应该是公认的答案,这就是
数据
的用途。只要你能防止密钥冲突,并记住字典中包含的任何信息1)在调用链中传播,2)可以在过程中修改,这是添加有用信息以简化调试的好方法。防止密钥冲突异常的一种方法是使用exception.Data[“additional Data”]=“补充数据“。是的,现有数据将被覆盖,但至少不会引发新的ArgumentException,从而隐藏原始异常。@JustinJStark很好,您不需要任何新的异常。但由于它是一个集合,您必须小心处理不存在的项目例外。如果
,您可以检查是否存在已具有
的现有项。你可以说得很详细,这是错误处理,不是关键路径。我同意了,但系统告诉我需要对Microsoft.CSharp.dll的引用。有人知道为什么吗?只是好奇。。。