c#net中投掷和投掷的区别

c#net中投掷和投掷的区别,c#,throw,C#,Throw,谁能简单地告诉我throw和throw ex之间的区别? 我读到throw存储了以前的异常,没有得到这一行。 我可以通过示例简要说明这一点吗?是-抛出重新抛出捕获的异常,并保留堆栈跟踪throw ex抛出相同的异常,但将堆栈跟踪重置为该方法 除非您想重置堆栈跟踪(即保护公共调用者不受库内部工作的影响),throw通常是更好的选择,因为您可以看到异常的起源 我还要提到一个“直通”挡块: try { // do stuff } catch(Exception ex) { throw;

谁能简单地告诉我
throw
throw ex
之间的区别? 我读到
throw
存储了以前的异常,没有得到这一行。

我可以通过示例简要说明这一点吗?

是-
抛出
重新抛出捕获的异常,并保留堆栈跟踪
throw ex
抛出相同的异常,但将堆栈跟踪重置为该方法

除非您想重置堆栈跟踪(即保护公共调用者不受库内部工作的影响),
throw通常是更好的选择,因为您可以看到异常的起源

我还要提到一个“直通”挡块:

try
{
   // do stuff
}
catch(Exception ex)
{
    throw;
}

这是毫无意义的。这是完全相同的行为,就好像根本没有
try/catch

Throw将重新引发原始异常

throw-ex将创建一个新异常,因此堆栈跟踪将更改。通常没有什么意义,通常你要么直接抛出,要么创建一个新的异常并抛出它,例如

// not a great code, demo purposes only
try{
File.Read("blah");
}
catch(FileNotFoundException ex){
throw new ConfigFileNotFoundException("Oops", ex);
}

throw
,在
catch
块中使用不带参数的
throw来重新显示导致
catch
的异常。throw在throw ex重置堆栈跟踪时维护堆栈跟踪。我建议你看这段视频,这段视频演示了如果你在抛出之前放一个log语句,它实际上并不是毫无意义的。这就是我经常使用它的方式。@Eugene你是对的,但我在抛出之前没有任何东西-这就是我想要说明的。我不止一次地使用过这种模式,
抛出新异常…
,通常只有在我被现有代码画到角落的情况下。如果我有时间/访问权/权限更改上游代码,我将尝试重构以不需要它。然而,我也偶尔在greenfield代码中使用这种模式。