
3.3.2 错误、异常和异常处理
从程序和软件层面来讲,错误有两种:一种是语法错误,即编译器和解释器不能理解程序员给出的代码而使得程序无法运行;另一种是逻辑上的错误,即程序可以运行,但程序员得不到原本想要的结果,或者程序在运行过程中发生错误,如栈溢出等。当Python检测到一个错误而使得程序无法运行时,则称“异常”出现了。
所以异常有两个阶段:首先是发生异常,可以是程序触发的,也可以是程序员手动触发的;其次是Python解释器检测到异常的出现,抛出一个异常产生的信号,当前运行的线程中断,并处理这个错误。
为了防止一些“无关痛痒”的错误出现而打断程序,需要用到异常处理语句try-except。try下面跟随一个语句,如果它出现了except所期望的异常,则except将处理这个错误,即运行其下挂的语句块的代码;如果try下挂的语句没有出现异常,则except下挂的语句是不会启用的,正如前面学习的示例一样,当捕捉到NameError时打印句子“目标对象已被删除”,提示用户str2已经被手动清除了,代码如下:

Python中除NameError外的其他常见异常如表3-8所示。
表3-8 Python中除NameError外的其他常见异常

续表

else语句可以和try-except语句连用组成try-except-else语句,示例如下:

输出结果:

上述代码的运行流程为输出用户输入的字符,当用户按Ctrl+Z快捷键时,程序中断并返回“中断错误”。还有一种语句是try-finally,它与try-except语句的区别在于,无论异常是否发生都运行finally下挂的语句,示例如下(在进行此操作之前先在F盘中新建一个TXT文件,并将其命名为1.py):


输出结果:

可以看到,由于打开了1.py文件,try-except没有捕捉到IOError,所以没有打印语句“没有文件。”,而try-finally无论是否打开了1.py文件都会打印语句“有没有都一样。”。