我有一个我一直在思考的基本问题。
请参阅以下使用 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)的评论非常感谢。谢谢你的时间。
答案 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()。据我所知,这可以为您提供有关异常的所有信息。