跳到主要内容

Python 异常处理

异常处理

基本的 try-except

try:
print(x)
except NameError:
print("Variable x is not defined")
except:
print("Something else went wrong")

# else 语句(如果没有引发错误,可以使用 else 关键字来定义要执行的代码块:)
try:
print("Hello")
except:
print("Something went wrong")
else:
print("Nothing went wrong")

# 无论 try 块是否引发错误,都会执行 finally 块
try:
print(x)
except:
print("Something went wrong")
finally:
print("The 'try except' is finished")


# 抛出异常
x = -1

if x < 0:
raise Exception("Sorry, no numbers below zero")


# 自定义异常
class CustomError(Exception):
def __init__(self,ErrorInfo):
super().__init__(self) # 初始化父类
self.errorinfo = ErrorInfo
def __str__(self):
return self.errorinfo

# 或直接啥也不写
class NetworkError(Exception):
pass

with 关键字

Python 中的 with 语句用于异常处理,封装了 try…except…finally 编码范式,提高了易用性。

with 语句使代码更清晰、更具可读性, 它简化了文件流等公共资源的管理。

在处理文件对象时使用 with 关键字是一种很好的做法。

file = open('./test.txt', 'w')
try:
    file.write('hello world')
finally:
    file.close()

以上代码我们对可能发生异常的代码处进行 try 捕获,发生异常时执行 except 代码块,finally 代码块是无论什么情况都会执行,所以文件会被关闭,不会因为执行异常而占用资源。

使用 with 关键字:

with open('./test.txt', 'w') as file:
    file.write('hello world !')

使用 with 关键字系统会自动调用 f.close() 方法,with 的作用等效于 try/finally 语句是一样的。

with 工作原理

(1)紧跟 with 后面的语句被求值后,返回对象的 __enter__() 方法被调用,这个方法的返回值将被赋值给 as 后面的变量; (2)当 with 后面的代码块全部被执行完之后,将调用前面返回对象的 __exit__() 方法。

with 工作原理代码示例:

class Sample:
def __enter__(self):
print "in __enter__"
return "Foo"
def __exit__(self, exc_type, exc_val, exc_tb):
print "in __exit__"

def get_sample():
return Sample()

with get_sample() as sample:
print "Sample: ", sample

代码的运行结果如下:

in __enter__
Sample: Foo
in __exit__