Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异常构造函数类_C# - Fatal编程技术网

C# 异常构造函数类

C# 异常构造函数类,c#,C#,当我使用这个时,它是否相同: catch(Exception e) { throw new Exception("some Exception", e); } 这是: catch(Exception e) { throw new Exception("some Exception", e.InnerException); } 或者我遗漏了什么?在第二个示例中,您将丢弃捕获的异常,并使用其内部异常。您通常会像第一个示例中那样编写代码 在第一种情况下,捕获的异常e将成为您要抛出的新

当我使用这个时,它是否相同:

catch(Exception e)
{
    throw new Exception("some Exception", e);
}
这是:

catch(Exception e)
{
   throw new Exception("some Exception", e.InnerException);
}

或者我遗漏了什么?

在第二个示例中,您将丢弃捕获的异常,并使用其内部异常。您通常会像第一个示例中那样编写代码

在第一种情况下,捕获的异常e将成为您要抛出的新异常的InnerException:

catch(Exception e)
{
    throw new Exception("some Exception", e);
}
在第二种情况下,您使用的是e的InnerException,来自e的数据丢失:


第一个例子一般来说更正确。当您作为另一个异常的结果抛出一个新异常时,您应该包括原始异常作为新异常的内部异常

但这并非普遍正确。在某些非常特殊的情况下,如果您想要撤消另一个代码对真实错误的包装,那么它可能非常有用

try {
  // some reflection call 
} catch (TargetInvocationException e) {
  // Reduce the layers of data a developer has to dig through by using the real
  // exception when I re-wrap
  throw new MyException("some message", e.InnerException);
}

有三种方法可以重新引发异常:

catch (Exception ex)
{
    throw;
}
抛出保留原始堆栈跟踪的原始异常

catch (Exception ex)
{
    throw ex;
}
抛出原始异常,但原始堆栈跟踪丢失。堆栈跟踪现在将此行显示为异常的发起人

catch (Exception ex)
{
    throw new Exception("...", ex);
}
抛出新异常,但保留原始异常及其堆栈跟踪作为新异常的InnerException

catch (Exception ex)
{
    throw new Exception("...", ex);
}
第一种情况在需要清理失败而不是成功的地方很有用。如果在这两种情况下都需要清理,那么可以使用finally子句,而不是catch子句。或者,您只想记录在这里发生的异常,并让调用方处理它

第二种情况根本没有什么用处。为什么要隐藏堆栈跟踪?可能有一些罕见的情况下,这是有用的,但我知道没有

第三种情况最常用于希望返回单一类型的异常或类型族的情况。例如,您是一个文本解析方法,希望将所有非致命异常转换为ParseException或任何提供额外详细信息(如发生异常的文本中的行号)的内容


在您提供的第二个示例中,捕获的异常被完全丢弃。将生成一个新异常,原始异常的InnerException将成为此新异常的InnerException。我无法想象剥离中间异常会有什么用处。

换句话说,我正在丢弃对象e中包含的异常?