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

时间:2015-06-11 12:38:33

标签: 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);
        }
    }
}

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

...
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
...

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;
        }
    }
...

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

5 个答案:

答案 0 :(得分:5)

  

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

如果您只想显示其消息,则无需检查每种异常类型。只需使用try { } catch (IndexOutOfRangeException indexOutOfRangeException) { //Specific handling } catch (DivideByZeroException divideByZeroException) { //Specific handling } catch (Exception ex) { //Exception handling for all other cases } 属性即可。

  

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

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

{{1}}

答案 1 :(得分:2)

Point(1)是正确的。

关于第(2)点,switch不是必需的。相反,你可以这样做:

try
{
    doSomethingElse()
}
catch (IndexOutOfRangeException)
{
    Console.WriteLine("Personalized message #1");               
}
catch (DivideByZeroException)
{
    Console.WriteLine("Personalized message #2");               
}
catch (Exception)
{
    Console.WriteLine("Personalized message #3");               
}

答案 2 :(得分:1)

在异常处理中,从最具体的异常转到更通用的异常(因此Exception是最后一个)。

您甚至可以从catch中重新抛出异常并根据需要修改消息

这样做的正确方法是:

try{
}catch(IndexOutOfRangeException e){
    LOGGER.errorFormat("This is an error {0}", e.Message);
    LOGGER.debugFormat("More infor on the exception {0}", e.StackTrace);
}catch(DivideByZeroException ex){
    LOGGER.errorFormat("This is an error {0}", ex.Message);
    LOGGER.debugFormat("More infor on the exception {0}", ex.StackTrace);
    throw new Exception("This is custom message");
}...
catch(Exception eex){
}

答案 3 :(得分:0)

  

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

不,没有必要,是的,你可以做到

  

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

它应该用于以不同的方式处理异常。但更重要的是,您应该使用catch来处理您不希望遇到的异常,而不是处理程序流(这是我想象您尝试使用个性化消息)。相反,你应该进行错误处理,以便在它到达之前捕获导致异常的事物

而不是

catch(IndexOutOfRangeException)

手前使用

if(currentIndex < something.Length)
     //do my thing

如果是来自用户输入,您可以通过其他方式在这种情况下验证currentIndex

答案 4 :(得分:0)

我建议不要使用ex.Message,而只使用ex.ToString()。据我所知,这可以为您提供有关异常的所有信息。

相关问题