zoukankan      html  css  js  c++  java
  • 06异常

    Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知 所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行; 如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。

    异常是使用 try-except 代码块处理的。 try-except 代码块让Python执行指定的操作,同时告 诉Python发生异常时怎么办。使用了 try-except 代码块时,即便出现异常,程序也将继续运行: 显示你编写的友好的错误消息,而不是令用户迷惑的traceback。

     

    1.处理 ZeroDivisionError 异常

    下面来看一种导致Python引发异常的简单错误。你可能知道不能将一个数字除以0,但我们 还是让Python这样做吧:

    In [1]:
    print(5/0)
    
     
    ---------------------------------------------------------------------------
    ZeroDivisionError                         Traceback (most recent call last)
    <ipython-input-1-fad870a50e27> in <module>
    ----> 1print(5/0)
    
    ZeroDivisionError: division by zero
     

    在上述traceback中,指出的错误 ZeroDivisionError 是一个异常对象。Python无法按你的 要求做时,就会创建这种对象。在这种情况下,Python将停止运行程序,并指出引发了哪种异常, 而我们可根据这些信息对程序进行修改。下面我们将告诉Python,发生这种错误时怎么办;这样, 如果再次发生这样的错误,我们就有备无患了。

     

    2.使用 try-except 代码块

    当你认为可能发生了错误时,可编写一个 try-except 代码块来处理可能引发的异常。你让 Python尝试运行一些代码,并告诉它如果这些代码引发了指定的异常,该怎么办。 处理 ZeroDivisionError 异常的 try-except 代码块类似于下面这样:

    In [2]:
    def caculator(a, b):
        try:
            print(a / b)
        except ZeroDivisionError:
            print("You can't divide by zero!")
        print('继续执行')
    
    In [4]:
    caculator(5,0)
    
     
    You can't divide by zero!
    继续执行
    
    In [5]:
    caculator(5,1)
    
     
    5.0
    继续执行
    
     

    我们将导致错误的代码行 print(5/0) 放在了一个 try 代码块中。如果 try 代码块中的代码运行 起来没有问题,Python将跳过 except 代码块;如果 try 代码块中的代码导致了错误,Python将查找 这样的 except 代码块,并运行其中的代码,即其中指定的错误与引发的错误相同。

    在这个示例中, try 代码块中的代码引发了 ZeroDivisionError 异常,因此Python指出了该如 何解决问题的 except 代码块,并运行其中的代码。这样,用户看到的是一条友好的错误消息,而 不是 traceback。

     

    如果 try-except 代码块后面还有其他代码,程序将接着运行,因为已经告诉了Python如何处 理这种错误,捕获错误后程序将继续运行。

     

    3.else模块

    通过将可能引发错误的代码放在 try-excep t代码块中,可提高这个程序抵御错误的能力。错 误是执行除法运算的代码行导致的,因此我们需要将它放到 try-except 代码块中。这个示例还包 含一个 else 代码块;依赖于 try 代码块成功执行的代码都应放到 else 代码块中

    In [6]:
    def caculator(a, b):
        try:
            print(a / b)
        except ZeroDivisionError:
            print("You can't divide by zero!")
        else:
            print('成功运行')
    
    In [8]:
    caculator(5,1)
    
     
    5.0
    成功运行
    
     

    4.捕获多个异常

    In [9]:
    try:
        a = 1
        print(a)
        b = 1 / 0
        print('hello')  # 异常抛出后不会继续执行了
    except (NameError, ZeroDivisionError):
        print('出现异常了')
       
    
     
    1
    出现异常了
    
    In [10]:
    try:
        a = 1
        print(a)
        b = 1 / 0
        print('hello')  # 异常抛出后不会继续执行了
    except (NameError, ZeroDivisionError) as ex:  # ex代表刚刚捕获的异常对象
        print('出现异常了')
        print(ex)
    
     
    1
    出现异常了
    division by zero
    
    In [11]:
    try:
        a = 1
        print(a)
        b = 1 / 0
        print('hello')  # 异常抛出后不会继续执行了
    except (NameError, ZeroDivisionError) as ex:  # ex代表刚刚捕获的异常对象
        print('出现异常了')
        print(ex)
    print('hello world')  # 因为捕获异常,所以继续执行
    
     
    1
    出现异常了
    division by zero
    hello world
    
    In [21]:
    x = "123"
    f = open('a.txt', 'w')
    try:
        f.write("hello")
        f.write("world %d" % x)
        print('ok')
    except Exception as ex:  # Exception所有异常的父类
        print('出现异常')
        print(ex)
    finally:  # 不管前面是否出现异常都会执行
        print('文件关闭')
        f.close()
    
     
    出现异常
    %d format: a number is required, not str
    文件关闭
    
    In [22]:
    x = "123"
    f = open('a.txt', 'w')
    try:
        f.write("hello")
        # f.write("world %d" % x)
        print('ok')
    except Exception as ex:  # Exception所有异常的父类
        print('出现异常')
        print(ex)
    else:  # 没有异常的情况下会执行的代码
        print('没有异常的情况下会执行的代码')
    finally:  # 不管前面是否出现异常都会执行
        print('文件关闭')
        f.close()
    
     
    ok
    没有异常的情况下会执行的代码
    文件关闭
    
     

    5.异常的嵌套

    In [30]:
    try:
        f = open('data\programming.txt')
        try:
            content = f.read()
            content.index("hadoop")
        except ValueError as ex:
            print(ex)
    except FileNotFoundError as ex:
        print(ex)
    finally:
        print('文件关闭')
        f.close()
    
     
    substring not found
    文件关闭
    
     

    一次性捕获所有异常就可以了,异常嵌套不常用

    In [31]:
    try:
        f = open('data\programming.txt')
        content = f.read()
        content.index("hadoop")
    except Exception as ex:
        print(ex)
    
     
    substring not found
    
     

    6.自定义异常

    In [32]:
    class PasswordException(Exception):
        def __init__(self, password, min_length):
            self.password = password
            self.min_length = min_length
            
        def __str__(self):
            return "%s的密码错误,密码最小长度为%s" % (self.password, self.min_length)
    
    In [33]:
    def reg(username, password):
        if len(password) < 6:
            raise PasswordException(password, 6)
        else:
            print("用户名为 %s,密码为 %s" % (username, password))
    
    In [35]:
    try:
        reg('zs', '1234')
    except Exception as ex:
        print(ex)
    
     
    1234的密码错误,密码最小长度为6
    
    In [36]:
    try:
        reg('zs', '1234')
    except PasswordException as ex:
        print(ex)
    
     
    1234的密码错误,密码最小长度为6
     
  • 相关阅读:
    Linux查看内容命令[持续添加]
    android4.0 x86下载编译简介
    android4.0 x86 裁剪与定制
    Android4.0 x86源码结构,生成目录结构
    android4.0 x86编译生成文件系统镜像system.img结构简介
    [翻译]Mootools 1.2新特性(一):元素存储(Element Storage)
    ASP.NET MVC Preview 3 STEP BY STEP 文章管理实例(一)
    Microsoft Speech API SDK
    PB串口编程资料MSCOMM32参数基本介绍
    Microsoft Speech API Overview(SAPI 5.4)
  • 原文地址:https://www.cnblogs.com/xinmomoyan/p/10862588.html
Copyright © 2011-2022 走看看