# Python 3.5 中的异常处理

> 原文： [https://javabeginnerstutorial.com/python-tutorial/exception-handling-python-3-5/](https://javabeginnerstutorial.com/python-tutorial/exception-handling-python-3-5/)

在本文中，我将向您介绍异常处理。 在本系列的前几篇文章中，我们使用异常处理来介绍一些罕见的异常情况（还记得*猜数字*游戏吗？），现在是时候解释如何在自己的应用中以及在什么时候使用它了。 去做吧。

## 有什么例外？

异常是在脚本/应用执行期间发生的错误。 顾名思义，异常很少发生，它们是常规工作流规则的异常。

在 Python 中，异常称为错误，使开发人员从其他语言进行迁移会造成混淆。 基本错误类是`Exception`，其他异常是该类的子类-这使事情更加混乱。

每次引发异常时，它都会进入调用栈，直到代码块对其进行处理。 如果没有代码可以处理该异常，则解释器将接管工作，写出讨厌的错误消息并终止正在运行的脚本。

自然地，在错误处理块中，您可以引发一个新异常或将当前异常抛出到顶部。 这是 Web 应用中的常见做法，在 Web 应用中，您希望记录服务调用导致了异常，但是您也想通过用户界面通知用户错误。 为此，您必须转发异常。

## 捕捉异常

您可能还记得，在*猜数字*游戏中，我们已经使用了异常处理。 处理异常的一般规则是您需要一个`try-except`块：

```java
try:
    block of code which might raise an error
except:
    exception handling
```

如您所见，可能引发异常的代码进入`try`块。 然后，错误处理将在`except`块中发生。

**但是**使用普通格式，但以下情况除外：在大多数情况下，如上例所示，这是一种不好的做法。 这是因为通过这种方式，您可以处理给定块中的所有异常，有时这超出了您的期望。

让我们创建一个简单的示例，在该示例中，我们调用一个总是引发异常的函数：

```java
def error_function():
    return int('nine')
```

如果我们在交互式解释器中定义此函数并调用它，则会出现异常：

```java
>>> error_function()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in error_function
ValueError: invalid literal for int() with base 10: 'nine'
```

现在，我们将此函数调用包装到`try-except`块中：

```java
>>> try:
...     error_function()
... except:
...     print('an exception occurred')
...
```

发生异常

在上面的示例中，我们捕获了`try`块中可能引发的所有异常。 但是，正如我提到的那样，这是一个不好的做法。 最好捕获那些我们知道它们可能会来的异常，并让真正意外的异常上升，直到它们被处理为止。 为此，我们一开始只会捕获语法错误：

```java
>>> try:
...     error_function()
... except SyntaxError:
...     print('an exception occurred')
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 2, in error_function
ValueError: invalid literal for int() with base 10: 'nine'
```

如您所见，在这种情况下，异常由解释器处理。 因此，更改异常处理以处理`ValueErrors`：

```java
>>> try:
...     error_function()
... except ValueError:
...     print('an exception occurred')
... 
```

an exception occurred

### 写出异常

有时仅捕获异常是不够的，但是您必须记录错误原因（有时记录到日志文件或控制台中），以使用户或应用管理员知道正在发生的情况。

为此，您可以按如下所示编写先前的异常处理块：

```java
>>> try:
...     error_function()
... except ValueError as e:
...     print('an exception occurred:', e)
... 
```

发生异常：以`int()`为基数 10 的无效文字：“`nine`”

如您在上面的示例中看到的，您可以掌握异常对象本身，并将其写入控制台。 如果执行此操作，则会显示异常消息。

## 引发异常

我说的是提出例外。 如果您有耐心并且没有用 Google 搜索该怎么做，那么时机已到。 好吧，与我所指的一样：

引发异常

这就引发了一个普遍的例外，对此没有太多了解。 您可以在交互式解释器中尝试一下：

```java
>>> raise Exception
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception
>>> raise Exception("MY custom error")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: MY custom error
```

如您所见，您可以提供一条消息作为异常的构造器参数，并在解释器处理错误时显示此消息-或者您可以如上一节所述将其提取。

## 结论

有时会发生异常。 在某些情况下，您或者想要处理它们，有时只希望脚本/应用停止执行。 在本文中，我们研究了如何捕获和处理异常以及如何将根本原因打印到用户的方式。