Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知 所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行; 如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。
异常是使用 try-except 代码块处理的。 try-except 代码块让Python执行指定的操作,同时告 诉Python发生异常时怎么办。使用了 try-except 代码块时,即便出现异常,程序也将继续运行: 显示你编写的友好的错误消息,而不是令用户迷惑的traceback。
print(5/0)
在上述traceback中,指出的错误 ZeroDivisionError 是一个异常对象。Python无法按你的 要求做时,就会创建这种对象。在这种情况下,Python将停止运行程序,并指出引发了哪种异常, 而我们可根据这些信息对程序进行修改。下面我们将告诉Python,发生这种错误时怎么办;这样, 如果再次发生这样的错误,我们就有备无患了。
def caculator(a, b):
try:
print(a / b)
except ZeroDivisionError:
print("You can't divide by zero!")
print('继续执行')
caculator(5,0)
caculator(5,1)
我们将导致错误的代码行 print(5/0) 放在了一个 try 代码块中。如果 try 代码块中的代码运行 起来没有问题,Python将跳过 except 代码块;如果 try 代码块中的代码导致了错误,Python将查找 这样的 except 代码块,并运行其中的代码,即其中指定的错误与引发的错误相同。
在这个示例中, try 代码块中的代码引发了 ZeroDivisionError 异常,因此Python指出了该如 何解决问题的 except 代码块,并运行其中的代码。这样,用户看到的是一条友好的错误消息,而 不是 traceback。
如果 try-except 代码块后面还有其他代码,程序将接着运行,因为已经告诉了Python如何处 理这种错误,捕获错误后程序将继续运行。
def caculator(a, b):
try:
print(a / b)
except ZeroDivisionError:
print("You can't divide by zero!")
else:
print('成功运行')
caculator(5,1)
try:
a = 1
print(a)
b = 1 / 0
print('hello') # 异常抛出后不会继续执行了
except (NameError, ZeroDivisionError):
print('出现异常了')
try:
a = 1
print(a)
b = 1 / 0
print('hello') # 异常抛出后不会继续执行了
except (NameError, ZeroDivisionError) as ex: # ex代表刚刚捕获的异常对象
print('出现异常了')
print(ex)
try:
a = 1
print(a)
b = 1 / 0
print('hello') # 异常抛出后不会继续执行了
except (NameError, ZeroDivisionError) as ex: # ex代表刚刚捕获的异常对象
print('出现异常了')
print(ex)
print('hello world') # 因为捕获异常,所以继续执行
x = "123"
f = open('a.txt', 'w')
try:
f.write("hello")
f.write("world %d" % x)
print('ok')
except Exception as ex: # Exception所有异常的父类
print('出现异常')
print(ex)
finally: # 不管前面是否出现异常都会执行
print('文件关闭')
f.close()
x = "123"
f = open('a.txt', 'w')
try:
f.write("hello")
# f.write("world %d" % x)
print('ok')
except Exception as ex: # Exception所有异常的父类
print('出现异常')
print(ex)
else: # 没有异常的情况下会执行的代码
print('没有异常的情况下会执行的代码')
finally: # 不管前面是否出现异常都会执行
print('文件关闭')
f.close()
try:
f = open('data\programming.txt')
try:
content = f.read()
content.index("hadoop")
except ValueError as ex:
print(ex)
except FileNotFoundError as ex:
print(ex)
finally:
print('文件关闭')
f.close()
try:
f = open('data\programming.txt')
content = f.read()
content.index("hadoop")
except Exception as ex:
print(ex)
class PasswordException(Exception):
def __init__(self, password, min_length):
self.password = password
self.min_length = min_length
def __str__(self):
return "%s的密码错误,密码最小长度为%s" % (self.password, self.min_length)
def reg(username, password):
if len(password) < 6:
raise PasswordException(password, 6)
else:
print("用户名为 %s,密码为 %s" % (username, password))
try:
reg('zs', '1234')
except Exception as ex:
print(ex)
try:
reg('zs', '1234')
except PasswordException as ex:
print(ex)