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代码中使用这种模式。