【问题标题】:Should I use builtin exception or define my own?我应该使用内置异常还是定义自己的异常?
【发布时间】:2019-02-21 13:05:40
【问题描述】:

我有类似的方法或功能:

findSomething(v)

如果我没有找到任何东西或者最好定义我自己的异常,是否适合引发 KeyError?你怎么看?

我知道,这不是严格的技术问题,但他们说:“可读性很重要”,我需要知道其他人的想法。 :)

【问题讨论】:

  • 什么是v?你需要找到什么?如果需要找钥匙,那么KeyError就可以了。如果您需要查找文件,请使用FileNotFoundError。如果您需要对异常进行任何自定义行为,请定义一个新行为(可能是现有行为的子类)。
  • 可能使用您的库的代码需要以不同于随机其他 KeyErrors 的方式处理此异常?如果是这样,它需要是不同的类型(即使它是 KeyError 的子类)。请记住,如果您使用泛型类型,那么如果他们需要在异常处理程序中将其与该泛型类型的不同实例消除歧义,那么您注定要遭受丑陋、脆弱的黑客攻击。
  • 相关:Is a best practice question off-topic?What goes on Software Engineering (previously known as Programmers)? A guide for Stack Overflow。这个问题在 SO 上不是主题,但这并不意味着没有其他 SE 站点会受到欢迎。

标签: python zen-of-python


【解决方案1】:

如果错误的性质很复杂,并且它的使用也在代码的其他地方重复,我会定义一个自定义错误。

只是因为它更具可读性:

raise MyError('reason for MyError')

比:

raise ValueError('the is an Error of type MyError, and here is the reason...')

但如果它不是代码的可重复部分,并且错误很明显,我会使用 ValueError(在 KeyError 之前)。

【讨论】:

  • 不要使用MyError :)
【解决方案2】:

可能会因为基于意见而被关闭,但是。

我更喜欢将KeyErrorValueError 等限制在本地范围内,即不大于内部 1 个函数,最好是内部的逻辑块。

假设您在发生异常的原始位置的几层中捕获了一个 KeyError。 它基本上没有给你任何信息,而且基本上可能发生在任何地方。 调用另一个函数的函数不应该知道被调用者的实现细节。 另外,您不是在编写代码来检查异常堆栈跟踪并在代码逻辑中使用它,是吗?

定义自定义异常使您有机会描述问题的位置和高级解释,例如UserNotFoundNoMatchingChannel。 您将在其中捕获它的代码将更深入地了解问题是什么以及如何处理它。

【讨论】:

    【解决方案3】:

    嗯,我想可读性更多地与您的编码方式有关,比如您如何命名变量、函数等,以及您如何构建代码并对其进行注释。

    但是,关于您遇到的异常处理问题:我认为您应该考虑以下几点:

    1- 如果函数得到一个有效的输入并且没有找到任何你不应该抛出或定义异常的东西。您只需要返回一个表示您没有找到任何东西的值和/或只是打印一条正确的消息。

    2- 如果输入参数 v 无效,具体取决于它是从类实例化的对象还是只是原始类型,您可以分别为其定义适当的异常或仅捕获内置异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2014-06-13
      • 2021-10-05
      • 2018-07-28
      • 2011-04-27
      • 2016-04-29
      相关资源
      最近更新 更多