在我抓住它之前,我应该总是知道我的异常的类型吗?

时间:2014-06-19 15:57:42

标签: java python c++ exception exception-handling

例如,写作是不好的做法:

try
{
  #some code
}
catch (Exception e){
  #some code
}

而不是

try
{
  #some code
}
catch (ExceptionName e){  #like ArrayIndexOutOfBoundsException
  #some code
}

我想这个问题几乎适用于所有语言,无论是Python,C ++,Java ......还有什么想法吗?

我在问,因为在我看来你不应该这样,因为这意味着你不知道你正在处理什么样的错误以及如何处理它,但我看到有些人这样做

3 个答案:

答案 0 :(得分:2)

YES!

这有一个例外:

你想抓住,做某事,然后重新投掷。也许你有一些资源需要在异常发生之前关闭,或者你想告诉用户发生了什么错误:

FileResource fileResource = new FileResource("/some/path");
try {
    fileResource.open();
    fileResource.dostuff();
    //other logic
} catch (Exception e){
    fileResource.close();
    throw e;
}

因此,当抛出异常时,您可以在程序退出之前关闭资源。

始终捕获最具体的异常类型。

此外,捕获所有异常在Python中非常糟糕,因为您可以捕获语法异常等。

答案 1 :(得分:2)

并非总是如果你的代码在生产中失败,你会想要一个优雅的退出。因此,更广泛的错误处理是个好例子。

def main():
    try:
        primary_process()
    except Exception as e: # Base error class that excludes keyboard interrupts
        logging.Error(e)   # and other things you don't want to catch.

但是,在您的代码中大多数情况下,您只能按照您的预期处理特定错误:

def something()
    part1() # don't expect the potential error to affect this, 
    part2() # so leave out of try block
    try:        # this infrequently raises an error for some reason, for now, 
        part3() # can't avoid. But we can handle if it happens.
    except LookupError as e: # specific error expected very infrequently
        handle(e)
    part4() 

另一个相关的Q& A:Why is "except: pass" a bad programming practice?

答案 2 :(得分:1)

是。确切地知道您正在捕获的异常类型总是一个好习惯,因为它有助于更​​好地处理