意外处理
- 我们在之前章节已经看到过大量的出错信息
- 例如:
$ ./user_input_int.py
Enter an integer number: abc
Traceback (most recent call last):
File "./user_input_int.py", line 6, in <module>
usr_num = int(usr_ip)
ValueError: invalid literal for int() with base 10: 'abc'
- 在这种例子中,程序更倾向于通知用户错误所在并给机会进行纠正
- Python通过
try-except结构实现
#!/usr/bin/python3
while True:
try:
usr_num = int(input("Enter an integer number: "))
break
except ValueError:
print("Not an integer, try again")
print("Square of entered number is: {}".format(usr_num * usr_num))
-
except可以用于特定的错误(本例为ValueError)
$ ./user_input_exception.py
Enter an integer number: a
Not an integer, try again
Enter an integer number: 1.2
Not an integer, try again
Enter an integer number: 3
Square of entered number is: 9
进一步阅读
- Python文档 - 错误、意外处理和抛出意外
- Python文档 - 内置意外
- stackoverflow - 意外信息捕捉
- stackoverflow - 避免裸意外
- Python文档 - pass语句
语法检查
- Python命令行选项可以用于一系列目的
- 语法检查是其中之一
$ python3 -m py_compile syntax_error.py
File "syntax_error.py", line 3
print "Have a nice day"
^
SyntaxError: Missing parentheses in call to 'print'
- 快速捕捉语法错误,像
if for with等等中缺失:和print语句缺少()是非常有用的 - 虽然这个例子仅仅是试验,真实世界的程序可能有上千行,非常难以找到打字错误
- Python文档 - cmdline
pdb
- 激活调试器是
cmdline的另一种用法 - 相比于使用
print万能大法,pdb拥有更多调试程序的功能特性,可以设置断点
$ python3 -m pdb if_elif_else.py
> /home/learnbyexample/python_programs/if_elif_else.py(3)<module>()
-> num = 45
(Pdb) p num
*** NameError: name 'num' is not defined
(Pdb) n
> /home/learnbyexample/python_programs/if_elif_else.py(6)<module>()
-> if num > 25:
(Pdb) p num
45
(Pdb) l
1 #!/usr/bin/python3
2
3 num = 45
4
5 # only if
6 -> if num > 25:
7 print("Hurray! {} is greater than 25".format(num))
8
9 # if-else
10 if num % 2 == 0:
11 print("{} is an even number".format(num))
(Pdb) q
-
l打印调试器所在当行语句的代码,用于可视化调试的进展 -
s执行当前行,步入函数调用 -
n执行当前行,将函数调用视为单个执行步骤 -
c继续执行知道下一个断点 -
p variable打印变量值 -
h命令列表-
h c获取c命令帮助
-
-
q退出调试器
进一步阅读
导入程序
- 我们可以直接导入(
import)程序到解释器测试功能 -
if __name__ == "__main__":构建- 内部代码让程序在运行时代码块被执行,例如:从命令行执行程序
- 内部代码当程序被当做模块导入时代码块不被执行,例如:使用程序的函数
- 一种好的方式是把所有的代码都放到
main函数内部,然后在if __name__ == "__main__":构造里调用main() - 注意
__name__和__main__前缀和后缀都是两个下划线
#!/usr/bin/python3
# ----- 没有参数的函数 -----
def greeting():
print("-----------------------------")
print(" Hello World ")
print("-----------------------------")
# ----- 有参数的函数 -----
def sum_two_numbers(num1, num2):
sum = num1 + num2
print("{} + {} = {}".format(num1, num2, sum))
# ----- 有返回值的函数 -----
def num_square(num):
return num * num
# ----- main -----
def main():
greeting()
sum_two_numbers(3, 4)
my_num = 3
print(num_square(2))
print(num_square(my_num))
if __name__ == "__main__":
main()
- 当作为程序运行时
$ ./functions_main.py
-----------------------------
Hello World
-----------------------------
3 + 4 = 7
4
9
- 当导入时
>>> import functions_main
>>> functions_main.greeting()
-----------------------------
Hello World
-----------------------------
>>> functions_main.num_square()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: num_square() missing 1 required positional argument: 'num'
>>> functions_main.num_square(5)
25
>>> functions_main.main()
-----------------------------
Hello World
-----------------------------
3 + 4 = 7
4
9
进一步阅读