【问题标题】:Do we have a concept of checked and unchecked exceptions in Python?我们在 Python 中有已检查和未检查异常的概念吗?
【发布时间】:2020-09-04 05:22:09
【问题描述】:

我的一位从事 JAVA 工作的朋友问我如何在 Python 中处理已检查和未检查的异常。我以前没有听过这些术语,所以我四处搜索以找出哪些是已检查和未检查的异常。我在 Python 中没有找到与这种异常相关的任何内容。

我们在 Python 中有已检查和未检查异常的概念吗?如果 不,那么默认情况下所有异常都是选中还是未选中?

提前谢谢你!

【问题讨论】:

标签: java python exception


【解决方案1】:

Java 有已检查和未检查的异常,因为 Java 是一种已编译的编程语言,已检查的异常在编译时出现。在 python 中,没有这样的例外,因为 Python 是一种解释型语言。

【讨论】:

  • 这与正在编译或解释的语言无关。尽管 Java 检查异常是在编译期间完成的,但这并不是它们存在的内在原因,而是实现细节。有许多编译语言根本没有异常的概念。
  • 我不知道为什么这被否决了,因为它在技术上是正确的。也就是说,值得指出的是,随着PEP484 的引入,Python 确实具有可以在运行前完成的类型检查(它通常作为单元测试的一部分执行),在那里他们可以完成检查异常。也就是说,PEP484 不涵盖已检查的异常。
【解决方案2】:

检查的异常在 Python 中不是一个东西。但是 Python 在异常类层次结构中确实有一些相似之处。这是Java结构:

source

在 Java 中,如果方法将抛出 Exception 或任何继承自 Exception 的类,但不会抛出 RuntimeException,则必须在方法签名中声明。此规则称为检查异常。它会强制用户考虑它们,否则应用程序将无法编译。

在 Python 中,我们仍然有类似的概念,但没有强制执行。你可能之前听说过,做一个简单的 except 语句是不好的风格,至少你应该选择 catch Exception

try:
   foo()
except: # bad!
   bar()

try:
   foo()
except Exception: # somewhat better!
   bar()

这是因为在 Python 中 Exception 是从 BaseException 扩展而来的,而一个裸露的 except 将捕获所有内容。例如,您可能不想捕获引发KeyboardInterruptctrl+c。如果您执行except:,则KeyboardInterrupt 将被捕获,但如果您执行except Exception:,您将让这个冒泡并停止应用程序。那是因为KeyboardInterrupt 扩展了BaseException 而不是Exception,因此不会被抓到!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多