11.异常处理

1.语法错误:也称解析错误,现象为出现错误的那一行会出现一个“箭头”,错误是由箭头上面的语句引起的。

while True print('Hello world')
File"C:/Users/111.py", line1
while True print('Hello world')
               ^
SyntaxError: invalid syntax

2.异常:是在运行时检测到的,即使语句或表达式在语法上是正确的,但在执行时可能会引发错误。

'4'+5
Traceback (most recent call last):
  File "C:/Users/111.py", line 1, in <module>
    '4'+5
TypeError: can only concatenate str (not "int") to str
5 * (5/0)
Traceback (most recent call last):
  File "C:/Users/111.py", line 1, in <module>
    5 * (5/0)
ZeroDivisionError: division by zero

3.处理异常
try语句:
(1)原理:a.执行 try 子句 (try 和 except 关键字之间的(多行)语句)。
b.如果没有异常发生,则跳过 except 子句 并完成 try 语句的执行。
c.如果在执行try 子句时发生了异常,则跳过该子句中剩下的部分。然后,如果异常的类型和 except 关键字后面的异常匹配,则执行 except 子句 ,然后继续执行 try 语句之后的代码。
d.如果发生的异常和 except 子句中指定的异常不匹配,则将其传递到外部的 try 语句中;如果没有找到处理程序,则它是一个 未处理异常,执行将停止并显示如上所示的消息。
注意:一个 try 语句可能有多个 except 子句,以指定不同异常的处理程序。 最多会执行一个处理程序。一个 except 子句可以将多个异常命名为带括号的元组。

except (RuntimeError, TypeError, NameError):
age = int(input('age:'))
class AgeError(Exception):
    pass

if age < 0 or age > 120:
    raise AgeError	#抛出AgeError错误
else:
    print(age)
    age: 133
Traceback(mostrecentcalllast):
 File"C:/Users/111.py", line6, in < module >
    raise AgeError  # 抛出AgeError错误
__main__.AgeError

try … except 语句有一个可选的 else 子句,在使用时必须放在所有的 except 子句后面。
except 子句可以在异常名称后面指定一个变量。这个变量和一个异常实例绑定,它的参数存储在 instance.args 中,输出时可以不用引用.args

try:
    raise Exception('sm', 'gs')
except Exception as ins:
    print(type(ins))    # the exception instance
    print(ins.args)  
    print(ins)       
    x, y = ins.args    
    print('x =', x)
    print('y =', y)
<class 'Exception'>
('sm', 'gs')
('sm', 'gs')
x = sm
y = gs

4.抛出异常
raise 语句允许程序员强制发生指定的异常,一般会有一个表达式异常的参数,而且如果当我们不确定是否引发了异常但不打算处理它,则可以使用更简单的 raise 语句形式重新引发异常

try:
    raise NameError('HiThere')
except NameError:
    print('An exception flew by!')
    raise
Traceback (most recent call last):
An exception flew by!
  File "C:/Users/111.py", line 2, in <module>
    raise NameError('HiThere')
NameError: HiThere
class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
 B
 C
 D       

5.定义清理操作
finally语句应用情况:不论try语句是否发生异常都会执行。

try:
    raise KeyboardInterrupt
finally:    
    print('dxfcgvhjk')
Traceback (most recent call last):
dxfcgvhjk
  File "C:/Users/111.py", line 2, in <module>
    raise KeyboardInterrupt
KeyboardInterrupt

(1)如果在执行 try 子句期间发生了异常,该异常可由一个 except 子句进行处理。 如果异常没有被 except 子句所处理,则该异常会在 finally 子句执行之后被重新引发。
(2)异常也可能在 except 或 else 子句执行期间发生。 同样地,该异常会在 finally 子句执行之后被重新引发。
(3)如果在执行 try 语句时遇到一个 break, continue 或 return 语句,则 finally 子句将在执行 break, continue 或 return 语句之前被执行。
(4)如果 finally 子句中包含一个 return 语句,则 finally 子句的 return 语句将在执行 try 子句的 return 语句之前取代后者被执行。

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("division by zero!")
    else:
        print("result is", result)
    finally:
        print("executing finally clause")
divide(2, 1)
'''
result is 2.0 
executing finally clause
'''
divide(2, 0)  
'''
division by zero!
executing finally clause
'''
divide("2", "1")
'''
result is Traceback (most recent call last):
  File "C:/Users/111.py", line 12, in <module>
    divide("2", "1")
  File "C:/Users/111.py", line 3, in divide
    result = x / y
TypeError: unsupported operand type(s) for /: 'str' and 'str'
executing finally clause
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值