Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在捕获异常之前,我是否应该始终知道异常的类型?_Java_Python_C++_Exception_Exception Handling - Fatal编程技术网

Java 在捕获异常之前,我是否应该始终知道异常的类型?

Java 在捕获异常之前,我是否应该始终知道异常的类型?,java,python,c++,exception,exception-handling,Java,Python,C++,Exception,Exception Handling,例如,写下以下内容是否被视为不良行为: try { #some code } catch (Exception e){ #some code } 而不是 try { #some code } catch (ExceptionName e){ #like ArrayIndexOutOfBoundsException #some code } 我想问题是几乎每种语言都有,比如java,C++,Java……有什么想法? 我这样问是因为在我看来,你不应该这样做,因为这意味着你不知道

例如,写下以下内容是否被视为不良行为:

try
{
  #some code
}
catch (Exception e){
  #some code
}
而不是

try
{
  #some code
}
catch (ExceptionName e){  #like ArrayIndexOutOfBoundsException
  #some code
}
我想问题是几乎每种语言都有,比如java,C++,Java……有什么想法? 我这样问是因为在我看来,你不应该这样做,因为这意味着你不知道你在处理什么样的错误以及如何处理它,但我看到有人这样做。

是的

只有一个例外:

你想接球,做点什么,然后再投。可能您有一些资源需要在异常出现之前关闭,或者您想通知用户发生了错误:

FileResource fileResource = new FileResource("/some/path");
try {
    fileResource.open();
    fileResource.dostuff();
    //other logic
} catch (Exception e){
    fileResource.close();
    throw e;
}
因此,当抛出异常时,可以在程序退出之前关闭资源

始终捕获您可以捕获的最具体的异常类型

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

是的

只有一个例外:

你想接球,做点什么,然后再投。可能您有一些资源需要在异常出现之前关闭,或者您想通知用户发生了错误:

FileResource fileResource = new FileResource("/some/path");
try {
    fileResource.open();
    fileResource.dostuff();
    //other logic
} catch (Exception e){
    fileResource.close();
    throw e;
}
因此,当抛出异常时,可以在程序退出之前关闭资源

始终捕获您可以捕获的最具体的异常类型


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

如果代码在生产环境中失败,您并不总是希望优雅地退出。因此,有一个很好的理由可以进行更广泛的错误处理

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() 

另一个相关的问题与解答:

如果代码在生产中失败,您可能会希望优雅地退出。因此,有一个很好的理由可以进行更广泛的错误处理

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() 


另一个相关问答:

是。确切地知道您捕获的异常类型始终是一种好的做法,因为它有助于更好地处理

是。确切地知道您捕获的异常类型始终是一种好的做法,因为它有助于更好地处理

在Python中,这当然是一种不好的做法…取决于上下文。这是一种不好的做法。您总是需要最具体的异常类型。两者都有用途,但后者应该比后者更频繁地使用。这个问题虽然有趣,但不适合这样做,因为它太宽泛和主观。问这个问题会更好。这在Python中肯定是不好的做法…取决于上下文。这是不好的做法。您总是需要最具体的异常类型。两者都有用途,但后者应该比后者更频繁地使用。这个问题虽然有趣,但不适合这样做,因为它太宽泛和主观。问这个问题会更好。如果你能再详细一点你关于catch do rethrow的例子,那就太好了。谢谢你的编辑。非常清楚。您不应该使用
finally
块吗?这难道不会丢失异常具体来自何处的信息吗?@user3580294:这更像是一个语言不可知的问题。对于Java,是的,
最终
可能是一个更好的选择。另外,在Java中,这样做不会丢失任何信息(堆栈跟踪是在创建新异常时生成的,而不是在重新显示异常时生成的)啊,对了,错过了其他语言标记。我的错误。也没有意识到堆栈跟踪是在创建异常时生成的。谢谢如果你能再详细一点你的关于catch do rethrow的例子,那就太好了。谢谢你的编辑。非常清楚。您不应该使用
finally
块吗?这难道不会丢失异常具体来自何处的信息吗?@user3580294:这更像是一个语言不可知的问题。对于Java,是的,
最终
可能是一个更好的选择。另外,在Java中,这样做不会丢失任何信息(堆栈跟踪是在创建新异常时生成的,而不是在重新显示异常时生成的)啊,对了,错过了其他语言标记。我的错误。也没有意识到堆栈跟踪是在创建异常时生成的。谢谢是的,我刚刚看到了那个,也是一个很好的答案,非常感谢你的链接,也感谢你的回答,非常清楚,我真的觉得我今天学到了一些东西。是的,我刚刚看到了那个,也是一个很好的答案,非常感谢你的链接,也感谢你的回答,非常清楚,我真的觉得我今天学到了一些东西。如果你应该总是确切地知道你正在捕获什么类型的异常,那么你不应该仅仅处理这是一种比捕获异常更优雅的方式吗?(参见Aaron Hall的回答)。您不能总是知道所有异常,例如运行时异常。但是您应该处理您认为您的尝试可以抛出的所有其他异常,以便更好地了解出了什么问题。此外,在类型Exception遗漏了所有特定的异常之后,您仍然可以捕获该类型的异常,这样您就可以优雅地结束。例如:如果您应该始终确切地知道要捕获的异常类型,请尝试{//some code}catch(someexception1s1){//}catch(someexception2s2){//}catch(exceptions3){///end gracefully},那么,除了捕获异常之外,您不应该只处理这个更优雅的方法吗?(参见Aaron Hall的回答)。您不能总是知道所有异常,例如运行时异常。但是您应该处理您认为您的尝试可以抛出的所有其他异常,以便更好地了解出了什么问题。此外,您还可以在Exception类型的异常错过所有特定的异常之后捕获它,这样您就可以优雅地结束。例如:try{//some code}catch(someException1s1){//}catch(someException2s2){//