一、实验目的
- 断言
- NameError
- TypeError
- 异常处理(try..except)
- 异常抛出(raise)
- finally 子句
二、知识要点
1.断言
Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,语法格式为:1
assert expression
例如我们的代码只能在windows系统下运行,可以先判断当前系统是否符合条件:1
2
3import sys
assert ('linux' in sys.platform), '错误'
print("hello")
会输出:1
2
3
4
5
6Traceback (most recent call last):
File "F:/Python/10/eg 10-1.py", line 5, in <module>
assert ('linux' in sys.platform), '错误'
AssertionError: 错误
Process finished with exit code 1
当我们将linux
更改为win32
就会输出hello
2.错误和异常
在程序执行过程中发生的任何错误都是异常。每个异常显示一些相关的错误信息,比如我们在 Python3 中使用 Python2 独有的语法就会发生SyntaxError
:1
print 'hello'
输出为:1
2
3
4 File "F:/Python/10/eg 10-1.py", line 11
print 'hello'
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('hello')?
而如果我们多打了一个空格:1
print('hello')
就会出现IndentationError
1
2
3
4
5
6 File "F:/Python/10/eg 10-1.py", line 12
print('hello')
^
IndentationError: unexpected indent
Process finished with exit code 1
接下来将介绍几种常见的异常:
2.1 NameError
当访问一个未定义的变量则会发生 NameError
,例如:print(a)
会输出:1
2
3
4Traceback (most recent call last):
File "F:/Python/10/eg 10-1.py", line 15, in <module>
print(a)
NameError: name 'a' is not defined
2.2 ZeroDivisionError
当把0
作为除数则会发生 ZeroDivisionError
,例如:print(1/0)
会输出:1
2
3
4Traceback (most recent call last):
File "F:/Python/10/eg 10-1.py", line 18, in <module>
print(1/0)
ZeroDivisionError: division by zero
2.3 TyprError
当操作或函数应用于不适当类型的对象时引发TyprError
,较为常见的是字符串与整数加法,例如:print('1'+1)
会输出:1
2
3
4Traceback (most recent call last):
File "F:/Python/10/eg 10-1.py", line 21, in <module>
print('1'+1)
TypeError: can only concatenate str (not "int") to str
3.异常处理
我将通过一个例子来解释上图的流程:
1 | a = 0 |
我们分别输入1
和a
,最后输入-1
结束,输出如下:1
2
3
4
5
6
7
8
9
10输入一个数字:1
2
输入类型无误
结束
输入一个数字:a
输入类型有误
结束
输入一个数字:-1
结束
循环结束
这个过程是这样的:
- 如果我们输入一个数字
-1
,程序停止循环,程序等价为:
1 | while a != -1: |
- 如果我们输入一个字母
‘a’
,程序异常,程序等价为:
1 | while a != -1: |
即程序在try
中的语句中出现了异常,会在except
中匹配对应的异常类型,如果未匹配则会终止程序,如果匹配上对应的异常类型会执行对应except
下的语句,如果语句中有fially
,在执行完except
中的语句会执行fianlly
中的语句。
- 如果我们输入一个整数
1
,程序无异常,程序等价为:
1 | while a != -1: |
即程序通过try
语句检测之后没有异常,如果是try-except
格式,在没有异常的情况下会直接跳出try-except
程序块,继续向下执行;如果是try-except-else
格式,在没有异常的情况下会进入else
语句中的代码;如果是try-except-else-finally
格式,在执行完else
语句会执行finally
语句中的内容。
4.抛出异常
使用raise语句主动抛出异常的意思是开发者可以自己制造程序异常,这里的程序异常不是指发生了内存溢出、列表越界访问等系统异常,而是指程序在执行过程中,发生了用户输入的数据与要求数据不符、用户操作错误等问题,这些问题都需要程序进行处理并给出相应的提示。处理这些问题多使用判断语句,在判断语句体内进行相应的问题处理,如果处理问题的语句过多,就会导致代码复杂化,代码结构不够清晰。在这种情况下,可以使用raise语句主动抛出异常,由异常处理语句块进行处理。例如:1
2
3
4
5
6
7
8
9
10
11try:
print("请输入登录账号:")
username = input(">>:")
if username != "zhe":
raise Exception("用户名输入错误")
print("请输入密码:")
psw = input(">>:")
if psw != "123456":
raise Exception("密码输入错误")
except Exception as e:
print(e)
在上述代码中,当我们输入用户名不是zhe
时会主动抛出异常用户名输入错误
而此时except
语句会捕获异常并输出,而如果我们用户名无误,程序会继续向下进行,在密码输入处如果错误会抛出密码输入错误
异常,由except
捕获之后输出,如果一直无误,程序执行完之后跳出try-except
语句。执行下一程序块。
三、实验内容
1.玩转函数
输入:
输出:
- 代码:
1 | import sys |
- 控制台的输出为:
1 | (venv) F:\Python\10>python hour.py 70 |
有关sys.argv[]
的解释
四、实验结果
无