![Python数据分析从小白到专家](https://wfqqreader-1252317822.image.myqcloud.com/cover/745/38209745/b_38209745.jpg)
3.3.2 错误、异常和异常处理
从程序和软件层面来讲,错误有两种:一种是语法错误,即编译器和解释器不能理解程序员给出的代码而使得程序无法运行;另一种是逻辑上的错误,即程序可以运行,但程序员得不到原本想要的结果,或者程序在运行过程中发生错误,如栈溢出等。当Python检测到一个错误而使得程序无法运行时,则称“异常”出现了。
所以异常有两个阶段:首先是发生异常,可以是程序触发的,也可以是程序员手动触发的;其次是Python解释器检测到异常的出现,抛出一个异常产生的信号,当前运行的线程中断,并处理这个错误。
为了防止一些“无关痛痒”的错误出现而打断程序,需要用到异常处理语句try-except。try下面跟随一个语句,如果它出现了except所期望的异常,则except将处理这个错误,即运行其下挂的语句块的代码;如果try下挂的语句没有出现异常,则except下挂的语句是不会启用的,正如前面学习的示例一样,当捕捉到NameError时打印句子“目标对象已被删除”,提示用户str2已经被手动清除了,代码如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_56_3.jpg?sign=1739285661-mBOD1erykKGUARFVsTlKEu6yFWza06kJ-0-3544a304fc9eb29fd6fd03c2acbeed9d)
Python中除NameError外的其他常见异常如表3-8所示。
表3-8 Python中除NameError外的其他常见异常
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_56_4.jpg?sign=1739285661-93VrkxAD7tUAwrViS1qLm9DSfG9lWCjt-0-de5ebb97d66c9333ca4365b4c687305a)
续表
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_57_1.jpg?sign=1739285661-3PW1cXtFNyPFOXwsrcQNXbgfI0iBTJlG-0-cd8b16c58190bfe3af12bdf2dec40899)
else语句可以和try-except语句连用组成try-except-else语句,示例如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_57_2.jpg?sign=1739285661-JYkAOrYnEQJCuG35FavdcMpJc5QwvM8h-0-4657a1de7a10e3a0c0ec528ba12cc617)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_57_3.jpg?sign=1739285661-h67w851CydEeACuV6hDywaGpkA0bKLTE-0-d88a425b2fd307a2fa55cbf3e4a312c8)
上述代码的运行流程为输出用户输入的字符,当用户按Ctrl+Z快捷键时,程序中断并返回“中断错误”。还有一种语句是try-finally,它与try-except语句的区别在于,无论异常是否发生都运行finally下挂的语句,示例如下(在进行此操作之前先在F盘中新建一个TXT文件,并将其命名为1.py):
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_57_4.jpg?sign=1739285661-rAiZfHQrWEK9CU1W4HWYdePbH9XbZruU-0-49e1473d57e825d0e60713b7d720829a)
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_58_1.jpg?sign=1739285661-YiA07NdZvQqkAcYVLG6RtVGWTFfNKHRT-0-aff28b19f18fd212aa4add7b061b7041)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_58_2.jpg?sign=1739285661-S5PFb5xiULN52nGld6DZpB9RP3KFKH05-0-61114c30d74f9c695452bbdfdd82188c)
可以看到,由于打开了1.py文件,try-except没有捕捉到IOError,所以没有打印语句“没有文件。”,而try-finally无论是否打开了1.py文件都会打印语句“有没有都一样。”。