【python基础】12-意外处理和调试


意外处理

  • 我们在之前章节已经看到过大量的出错信息
  • 例如:
$ ./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命令行选项可以用于一系列目的
  • 语法检查是其中之一
$ 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

进一步阅读

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,399评论 19 139
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 9,667评论 4 16
  • 前言 Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打...
    依依玖玥阅读 8,931评论 6 37
  • 大抵是四五岁的时候,很喜欢在绘本上描出一个个手指的形状。只用铅笔沿着手指轮廓很小心的画下去,好像这幼稚的娱乐在我...
    云栖雁阅读 1,501评论 0 0
  • 一颗浮躁的心没有着落 不知道未来会有怎样的抉择等着我 害怕时的错过 懦弱时的畏缩 将自己的龟壳分分钟击破 看着自己...
    BULABULA小八阅读 1,547评论 2 3