在C#中抛出或不抛出异常
本文关键字:抛出异常 | 更新日期: 2023-09-27 18:22:06
可能重复:
为什么在C#中捕获并重新抛出异常?
我一直在网上搜寻这个问题的答案——两者之间有什么区别?
try
{
//Do Something
}
catch
{
throw;
}
与
try
{
//Do Something
}
catch
{
}
或
try
{
//Do Something
}
catch (Exception Ex)
{
//Do something with Exception Ex
}
第一个在堆栈中重新抛出异常并保留堆栈跟踪。
第二个吞下(隐藏)了例外。
第三个可能也包含例外,但这取决于(//做某事)做了什么。
catch-->throw实际上只是抛出您的错误,所以您必须在其他地方捕获它。如果您想先捕获一些内容,然后将错误抛出到上面的其他方法,那么这可能很有用。
示例:
try
{
// do something
}
catch
{
Console.WriteLine("Something went wrong, and you'll know it");
throw;
}
// won't get here anymore, the exception was thrown.
而try-->catch只会让您忽略错误。
try
{
// do something
}
catch
{
Console.WriteLine("Something went wrong, and you won't know it.");
}
// continuing happily
第一个重新抛出捕获的相同异常。第二个吞下了这个例外,好像它从未发生过一样。所以这取决于你需要什么。
请注意,IS这两者之间存在差异:
try
{
//Do Something
}
catch (Exception Ex)
{
//re-throws the same exception that was caught
throw;
}
try
{
//Do Something
}
catch (Exception Ex)
{
//throws a _new_ exception containing Ex
throw Ex;
}
在第一个例子中,您只是在重新引发异常。在这种情况下,您不需要try/catch,因为您没有对捕获的异常执行任何操作。
在第二种情况下,你吞下了所有的例外。这是非常危险的。永远不要这样做。它从来都不是正确的。
最后,你没有给我们足够的细节。你正在抓住这个例外,你可能会对它做点什么。你可以重新思考,你可以吞下。你还没有告诉我们。
在第一个块中,第一个块的处理程序内部再次抛出异常。这意味着它可以由外部try/catch作用域块拾取。第二个块"吃掉"catch块中的异常,catch块的代码执行完毕后,程序可以正常继续执行。
在第一种情况下,会向调用方重新抛出异常。这个版本毫无意义,因为您对异常不做任何操作,但在实践中,您可能会做一些事情,然后将异常抛出给调用者。它在过滤异常时也很有用,例如
try
{
//do somethign
}
catch(Exception1)
{
throw;
}
catch
{
//do something
}
第二个是你永远不应该做的事情。你覆盖了一个异常,使你的应用程序更难发现最终的错误。您要么需要以有意义的方式处理异常,要么让它破坏程序(或者让调用者处理它)
第三个例子是简单的异常处理。确保不要将其用作if/else(流量控制)的形式