我应该始终指定`except`声明的异常类型?我应该始终指定`except`声明的异常类型?(Sho

2019-05-05 11:40发布

当使用PyCharm IDE使用except:无异常型触发从这个例外条款是IDE提醒Too broad

我应该忽略这一建议? 或者是Python的总是特定的异常类型?

Answer 1:

这几乎总是最好指定明确的异常类型。 如果使用的是赤裸裸的except:条款,你可能最终赶上比预期要赶上那些其他例外-这可以掩盖错误或使其难以调试程序时,他们没做你所期望的。

例如,如果你插入一行到数据库中,你可能想捕捉异常,表示该行已经存在,所以你可以做一个更新。

try:
    insert(connection, data)
except:
    update(connection, data)

如果指定裸except: ,你也会赶上表明该数据库服务器已经下降了一个套接字错误。 这是最好只赶上你知道如何处理异常 - 它往往是更好地为程序在异常不是继续,但奇怪的意想不到的方式表现的点失败。

一种情况下,您可能希望使用裸except:在你需要始终在运行,就像一个网络服务器程序的顶层。 但是,你必须非常小心地记录异常,否则就不可能制定出什么错。 基本上,应该只有在一个程序,这是否至多一个地方。

其推论这一切是你的代码应该从来都raise Exception('some message')因为它迫使客户端代码使用except: (或except Exception:几乎是一样糟糕)。 您应该定义具体到要信号(一些内置的异常子类如可能继承问题异常ValueErrorTypeError )。 或者,你应该提出一个具体内置的异常。 这使你的代码的用户是在追赶只是他们要处理的异常谨慎。



Answer 2:

You should not be ignoring the advice that the interpreter gives you.

From the PEP-8 Style Guide for Python :

When catching exceptions, mention specific exceptions whenever possible instead of using a bare except: clause.

For example, use:

 try:
     import platform_specific_module 
 except ImportError:
     platform_specific_module = None 

A bare except: clause will catch SystemExit and KeyboardInterrupt exceptions, making it harder to interrupt a program with Control-C, and can disguise other problems. If you want to catch all exceptions that signal program errors, use except Exception: (bare except is equivalent to except BaseException:).

A good rule of thumb is to limit use of bare 'except' clauses to two cases:

If the exception handler will be printing out or logging the traceback; at least the user will be aware that an error has occurred. If the code needs to do some cleanup work, but then lets the exception propagate upwards with raise. try...finally can be a better way to handle this case.



Answer 3:

不specfic到Python这一点。

例外的整点是应对尽可能接近它是造成尽可能的问题。

所以,你记住这可能会在特殊的基本状况可能会引发问题,并解决“下一步”对方的代码。

事情是你无法知道所有可能通过一段代码抛出的异常。 所有你能知道的是,如果它是一个说一个文件,未发现异常,那么你可以捕获它,并提示用户得到一个没有或取消该功能。

如果你把试图赶上一轮,那么不管是什么问题了。在你的文件例程(只读,权限,UAC,不是一个真正的PDF等),每个人都将在拖放到文件中未找到catch和您的用户尖叫“但它是存在的,这个代码是胡扯”

现在有一对夫妇的情况下,你可能赶上一切,但他们应该有意识地选择。

他们抓,取消一些地方的行动(如创建或锁定资源,(在磁盘上打开一个文件编写实例),然后再次抛出异常,在更高的层面上处理)

其他的你是你不在乎为什么出错。 打印的实例。 你可能有一个包罗万象的一轮,说有一些问题与您的打印机,请整理出来,而不是杀死,因为它的应用。 奥纳类似徒劳如果你的代码执行一系列使用某种时间表的独立的任务,你wouldnlt想整个事情就不行了,因为任务之一失败。

注意:如果你做到上面,我不能推荐某种异常日志记录,例如尝试捕捉日志末尾,高度不够。



Answer 4:

您也将赶上例如控制-C与,所以不要那么做,除非你再“扔”了。 然而,在这种情况下,你应该喜欢使用“终于”。



Answer 5:

始终指定的异常类型,也有很多种类,你不想赶,像SyntaxErrorKeyboardInterruptMemoryError等。



Answer 6:

下面是我在那里只是没有类型使用的地方

  1. 快速和肮脏的原型

这是在我的代码为unchecked异常主要使用

  1. 顶级main()函数,其中i记录每一个未捕获的异常

我总是添加此,使生产代码不外溢踪迹

  1. 应用层之间

我有两种方法可以做到这一点:

  • 第一种方式做到这一点:当一个更高级别的层调用一个较低水平的功能,它包裹在输入节选呼叫处理“顶”较低水平的异常。 但我添加了一个通用的except语句,以检测未处理的较低水平的异常在较低水平的功能。

我更喜欢这种方式,我觉得它更容易发现哪些异常应该被适当地抓住了我“看”当一个较低的水平记录异常的问题,更好地通过更高水平

  • 第二方式做到这一点:较低级别层中的每个顶层功能有其代码包裹在一个通用的除外,它捕获该特定层上的所有未处理的异常。

有些同事更喜欢这种方式,因为它保持较低水平异常低级别的功能,他们“属于”。



Answer 7:

试试这个:

try:
    #code
except ValueError:
    pass

我从这个链接的回答,如果没有其他人遇到这个问题, 检查出来



文章来源: Should I always specify an exception type in `except` statements?