在C#中检查try/catch块中的异常类型

gac*_*epa 2 c# exception-handling try-catch

我有一个我一直在思考的基本问题.

请参阅以下使用try/catch块的代码段:

public void doSomething()  
{  
   try
    {
        doSomethingElse()
    }
    catch (Exception ex)
    {
        if (ex is IndexOutOfRangeException || ex is DivideByZeroException || ex is Exception)
        {
            Console.WriteLine(ex.Message);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

1)如果我想要做的就是将异常消息输出到控制台,是否有必要检查if子句我得到的异常类型,或者我可以做什么

...
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
...
Run Code Online (Sandbox Code Playgroud)

2)我的理解是,如果我需要将已定义的消息输出到控制台而不是使用异常消息本身,则应该使用检查特定的异常类型 -

...
    catch (Exception ex)
    {
        switch (ex):
        {
            case IndexOutOfRangeException:
                Console.WriteLine("Personalized message #1");               
                break;
            case DivideByZeroException:
                Console.WriteLine("Personalized message #2");               
                break;
            case Exception:
                Console.WriteLine("Personalized message #3");               
                break;
        }
    }
...
Run Code Online (Sandbox Code Playgroud)

您对1)和2)的评论非常感谢.谢谢你的时间.

Hab*_*bib 5

1)如果我想要做的就是将异常消息输出到控制台,是否有必要检查if子句我得到的异常类型

如果您只想显示其消息,则无需检查每种异常类型.只需使用Exception.Message财产.

2)我的理解是,如果我需要将已定义的消息输出到控制台而不是使用异常消息本身,则应该使用检查特定的异常类型

而是捕获基本异常,然后将每个异常与不同类型进行比较,首先捕获特定异常,然后在每个catch块中最后定位

try
{

}
catch (IndexOutOfRangeException indexOutOfRangeException)
{
      //Specific handling
}
catch (DivideByZeroException divideByZeroException)
{
      //Specific handling
}
catch (Exception ex)
{
      //Exception handling for all other cases
}
Run Code Online (Sandbox Code Playgroud)