是否可以像这样处理特定的异常?

本文关键字:异常 处理 像这样 是否 | 更新日期: 2023-09-27 18:16:07

我在很多地方看到过这样的代码,这样做有什么好处吗?或者这是一种错误的做法…

try
{
    ......
}   
catch (NullReferenceException ex)
{
    Data.LogError(ex, "Exception occourred while ...");
}
catch (IndexOutOfRangeException ex)
{
    Data.LogError(ex, "Exception occourred while ...");
}
catch (Exception ex)
{
    Data.LogError(ex, "Exception occourred while ...");
}

特定的异常处理上下文中

是否可以像这样处理特定的异常?

如果你打算在catch块中以不同的方式处理异常(即,由于异常被抛出而执行不同的操作),这是有好处的。

否则,你可以删除更具体的异常处理程序,只使用最通用的:

catch(Exception ex)

注意:如果异常纯粹用于日志记录,那么有时重新抛出异常以将其气泡化到应用程序的其余部分可能是有用的:

try{
}
catch(Exception ex){
   // Log exception here
   throw;
}

这甚至比通用的catch更好,因为您可以选择如何处理特定类型的异常。例如,如果某个文件不存在,您希望显示一条消息,并提供重试,否则将终止应用程序。

您还可以以不同的方式处理异常,因为它们提供了不同的属性(感谢rot指出了这一点):

try
{
}
catch(FileNotFoundException ex)
{
    Console.WriteLine(ex.FileName + " not found");
    //Retry
}
catch(Exception ex) // Exception does not contain ex.FileName
{
    //Save stuff
    //Exit
}

只执行第一个匹配块

如果您想以自己的方式处理/记录任何特定的异常,那么给出的方法是最好的。此外,在场景中,您可以用更合适的细节通知用户,而不是提供通用消息。现在,如果你不想处理不同的异常,那么你可以继续使用一个catch块,它捕获所有异常。