Python 简明教程 --- 23,Python 异常处理
目录
我们在编写程序时,总会不自觉的出现一些错误,比如
在写程序时一定要把所有的情况都考虑到,并且处理掉,不能有侥幸心理(认为某种情况不会出现)。在程序中,只要是 程序员也喜欢将这些错误戏称为 Python 中提供了一套处理错误的机制,叫做 比较普通的处理错误的方法,是使用 1,常见异常我们来看一些Python 中常见的异常。
Python 语言有自己的语法格式和规则,如果我们没有遵守这些规则,将会出现异常:
上尖括号
如果我们使用了一个
进行除法运算时,如果除数为
如果程序没有处理异常,在异常出现时,将会崩溃退出,Python 解释器会为你定位到 2,处理异常异常需要捕获,从而处理异常。如果在发生异常时,这个异常没有被捕获处理,这个异常将会一层一层的向上抛,直到这个异常被捕获处理,或者程序崩溃。
在Python 中使用 我们一般将 比如,我们有如下代码: @H_502_161@def hello(s):
print('hello %s' % s)
hello('123','abc')
其中
代码在遇到 我们可以这样处理该异常: @H_502_161@try:
hello('123','abc')
except Exception as e:
print(e)
我们将
可见错误被打印了出来。我们还可以在打印错误之后,再正确的调用 @H_502_161@try:
hello('123','abc')
except Exception as e:
print(e)
hello('123')
运行结果如下:
可见,运行到
一般在捕获异常时,尽量只在
@H_502_161@except (Error1,Error2...):
pass
一个 @H_502_161@try:
# 代码块
except Error1 as e:
# 处理 Error1
except Error2 as e:
# 处理 Error2
.
.
.
except:
e = sys.exc_info()[0])
pass
多个 其中,最后一个 在有多个
Python 中, 发生异常时,示例: @H_502_161@try:
hello('123','abc')
except Exception as e:
print('发生异常')
print(e)
else:
print('没有发生异常')
上面的代码中,执行到
没有发生异常时,示例: @H_502_161@try:
hello('123')
except Exception as e:
print('发生异常')
print(e)
else:
print('没有发生异常')
上面代码中的
没有发生异常时,示例如下: @H_502_161@try:
hello('123')
except Exception as e:
print('发生异常')
print(e)
else:
print('没有发生异常')
finally:
print('执行了 finally 语句块')
上面代码中,
发生异常时,示例如下: @H_502_161@try:
hello('123','abc')
except Exception as e:
print('发生异常')
print(e)
else:
print('没有发生异常')
finally:
print('执行了 finally 语句块')
上面代码中,
3,抛出异常
如果你捕获了一个异常,却不想彻底解决这个异常,而想将该异常向上层抛出,可以使用
@H_502_161@raise Exception('这里发生了错误')
@H_502_161@try:
hello('123','abc')
except Exception as e:
print('发生异常')
raise
Python 解释器会记录最后一个发生的异常,
示例如下: 表达式
表达式
@H_514_502@4,Python 异常层次结构
Python 异常层次结构如下: @H_502_161@BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
| +-- ModuleNotFoundError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
这些都是 5,自定义异常有时候,我们需要定义自己的 我们已经知道,Python 异常类有自己的层次结构,所有的类都直接或者间接继承了 一般情况下,自定义异常需要继承 @H_502_161@class MyError(Exception):
pass
如果没有为 6,调试错误程序编写完成后不一定是正确的,当发现有错误时,就需要定位错误的位置。 最普遍,最简单的调错的方法就是打印某个变量,通过输出变量的值,来查看其是否是你想要的结果。 另一种比较高效,有力的调试代码的方式是 在 在Python 中, 如下代码,文件名为 @H_502_161@#! /usr/bin/env python3
# 引入 pdb 模块
import pdb
def hello(s):
print('hello %s' % s)
# 设置断点
pdb.set_trace()
hello('python')
hello('java')
我们使用
可以看到代码在
(完。) 推荐阅读: Python 简明教程 --- 18,Python 面向对象 Python 简明教程 --- 19,Python 类与对象 Python 简明教程 --- 20,Python 类中的属性与方法 Python 简明教程 --- 21,Python 继承与多态 Python 简明教程 --- 22,Python 闭包与装饰器 欢迎关注作者公众号,获取更多技术干货。
(编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


