Python菜鸟学习手册11----异常处理

介绍  

    在项目开发中,异常处理是不可或缺的。异常处理帮助人们debug,通过更加丰富的信息,让人们更容易找到bug的所在。异常处理还可以提高程序的容错性。

>>> 1/0
Traceback (most recent call last):
  File "", line 1, in 
    1/0
ZeroDivisionError: division by zero
上例中输入一除以零触发ZeroDivisionError异常。下面我们来捕捉这个异常

strFormula=input("请输入公式")
while(True):
    if strFormula=="exit":
        print("计算结束")
        break
    try:
        print("%s=%.2f" %(strFormula,eval(strFormula)))
    except ZeroDivisionError:
        print("除数不能为零")
    except:
        print("公式输入有误!")
    strFormula=input("请输入公式")

     如果try中有异常发生时,将执行异常的归属,执行except。异常层层比较,看是否是exception1, exception2...,直到找到其归属,执行相应的except中的语句。如果except后面没有任何参数,那么表示所有的exception都交给这段程序处理。


如果无法将异常交给合适的对象,异常将继续向上层抛出,直到被捕捉或者造成主程序报错。比如下面的程序

def test_func():
    try:
        m = 1/0
    except NameError:
        print("Catch NameError in the sub-function")

try:
    test_func()
except ZeroDivisionError:
    print("Catch error in the main program")
子程序的try...except...结构无法处理相应的除以0的错误,所以错误被抛给上层的主程序。

抛出异常

当程序出现错误,python会自动引发异常,也可以通过 raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行。
try:
     s = None
     if s is None:        #is检查两个对象是否是同一个对象
         print ("s 是空对象")
         raise Error1     #如果引发Error1异常,后面的代码将不能执行
     print (len(s))
except TypeError:
     print ("空对象没有长度")

自定义异常

python允许程序员自定义异常,用于描述python中没有涉及的异常情况,自定义异常必须继承Exception类,自定义异常按照命名规范以"Error"结尾,显示地告诉程序员这是异常。自定义异常使用raise语句引发,而且只能通过人工方式触发。
class MyInputException(Exception):  
    def __init__(self, length, least):  
        Exception.__init__(self)  
        self.length = length  
        self.least = least  
  
  
try:  
    s = input('输入一个字符串:')  
# 如果长度小于5,触发自定义的异常   
    if len(s) < 5:  
        raise MyInputException(len(s), 5)  
except EOFError:  
    print ('触发了EOF错误,按了Ctrl+d')  
except MyInputException as x:                                             #2.6版本之后要使用as
    print ('输入的字符串只有%d,至少需要%d个字符' % (x.length, x.least))  
except Exception:  
    print ('不知道什么错误!' ) 
finally:  
    print ('有没有异常都会执行这里!')  



小提示:

1.异常处理的格式

try:
    ...
except exception1:
    ...
except exception2:
    ...
except:
    ...
else:                        #如果try中没有异常,那么except部分将跳过,执行else中的语句。
    ...
finally:                     # finally是无论是否有异常,最后都要做的一些事情。
    ...

2.

file_object = open('thefile.txt')
try:
     all_the_text = file_object.read( )
finally:                                    #文件读写将.close()放在finally中是个好习惯
     file_object.close( )

3.python中is和 == 的区别

在python中,is检查两个对象是否是同一个对象,而==检查他们是否相等.

p = [1]
q = [1]
p is q # False 因为他们不是同一个对象
p == q # True 因为他们的值相等
所以如果你要比较两个值是否相同就用==,如果比较是否是同一个对象就用is.
其实python中的is比较的对象很像C语言中的指针,只有地址相同的指针才是同一个指针.

上一讲: Python菜鸟学习手册10----文件的输入与输出

下一讲:  Python菜鸟学习手册12----循环对象




如果有什么疑问欢迎到我的微信公众号提问~

你可能感兴趣的:(Python)