zoukankan      html  css  js  c++  java
  • Python学习笔记(二十一)--异常处理

    一、什么是异常?
      异常就是python程序执行过程中发生的错误!
    二、异常的处理
      python解释器在执行程序过程总,检测到了一个错误,触发异常(也允许程序员自己触发异常),异常触发后在没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行。这样就导致我们的程序奔溃或者无法执行。异常处理就是程序员编写特定的代码(这段代码与程序逻辑无关,与异常处理有关),在程序报错后去捕捉这个报错异常并进行处理使程序可以正常执行。
      注:程序运行中的异常可以分为两类:语法错误和逻辑错误。我们需要知道,语法错误跟异常处理无关,所以我们在处理异常之前,必须避免语法上的错误。
    三、异常捕获及处理的几种方式?
    第一种方式:异常捕捉可以使用 try/except 语句。

    格式:
    try:
         被检测的代码块
    except 异常类型:
         try中一旦检测到异常,就执行这个位置的逻辑
    工作方式:
    • 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
    • 如果没有异常发生,忽略 except 子句,try 子句执行后结束。
    • 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
    • 如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。
    举例:判断用户输入的内容是否为数字,如果输入的是数字程序不报错;如果输入的内容非数字,测程序抛出异常“请输入一个数字!”
    1 try:
    2     a = int(input('>>>>'))
    3 except ValueError:
    4     print('请输入一个数字!')
    注意:
    1、一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。只有满足特定条件才会执行后续的代码块;
    1 try:
    2     a = int(input('>>>>'))
    3 except ValueError:
    4     print('请输入一个数字!')
    5 except NameError:
    6     print('请输入正常的名字!')
    2、一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,只要程序的抛出的异常存在在except元组中,就会执行except后的代码块
    1 try:
    2     a = int(input('>>>>'))
    3 except (NameError,ValueError):
    4     print('请输入一个数字!')
    3、except子句可以忽略异常的名称,它将被当作通配符使用。可以使用这种方法打印一个错误信息,然后再次把异常抛出。
    1 try:
    2     a = int(input('>>>>'))
    3 except :
    4     print('请输入一个数字!')
    5     raise #抛出异常信息
    4、万能异常处理可以在except后添加Exception,他可以捕获任意异常;
    1 try:
    2     a = int(input('>>>>'))
    3 except Exception :
    4     print('请输入一个数字!')
    注意:
      1、如果我们想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么只有一个Exception就足够了
      2、如果我们想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支来进行准确的处理。我们可以使用多分支+万能异常来处理异常。使用多分支优先处理一些能预料到的错误类型,一些预料不到的错误类型应该被最终的万能异常捕获。需要注意的是,万能异常一定要放在最后,否则就没有意义了。
     
    5、别名的使用:可以使用except与as+变量名 搭配使用,打印变量名会直接输出报错信息
    1 try:
    2     a = int(input('>>>>'))
    3 except Exception as e:
    4     print('请输入一个数字!')
    5     print(e)
    第二种方式:try/except...else
    try:
         被检测的代码块
    except 异常类型:
         try中一旦检测到异常,就执行这个位置的逻辑
    else:
    没有异常时执行的代码
    工作方式:
    • 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
    • 如果没有异常发生,忽略 except 子句,try 子句执行后执行else语句后的代码块。
    • 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行,执行完后else语句不执行。
    举例:判断用户输入的内容是否为数字,如果输入的是数字程序不报错并给出输入正确的提示;如果输入的内容非数字,测程序抛出异常“请输入一个数字!”
    1 try:
    2     a = int(input('>>>>'))
    3 except ValueError:
    4     print('请输入一个数字!')
    5 else:
    6     print('输入正确!')
    第三种方式:try-finally语句,try-finally 语句无论是否发生异常都将执行最后的代码。
    格式:
    1 try:
    2      被检测的代码块
    3 except 异常类型:
    4      try中一旦检测到异常,就执行这个位置的逻辑
    5 else6 没有异常时执行的代码
    7 finally:
    8 不管有没有异常都执行的代码块
    工作方式:
    • 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
    • 如果没有异常发生,忽略 except 子句,try 子句执行后执行else语句后的代码块,然后在执行finally语句块。
    • 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行,执行完后else语句不执行,finally语句块被执行。
    举例说明:判断用户输入的内容是否为数字,如果输入的是数字程序不报错并给出输入正确的提示;如果输入的内容非数字,测程序抛出异常“请输入一个数字!”,最后不管是否报异常我都给出谢谢的提示信息
    1 try:
    2     a = int(input('>>>>'))
    3 except ValueError:
    4     print('请输入一个数字!')
    5 else:
    6     print('输入正确!')
    7 finally:
    8     print('Thank You!')
    四、主动抛出异常
    Python 使用 raise 语句抛出一个指定的异常。
    格式:raise [Exception [, args [, traceback]]]
    举例:如果 x 大于 5 就触发异常:
    1 x = 10
    2 if x > 5:
    3     raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
    执行以上代码会触发异常:
    Traceback (most recent call last):
      File "test.py", line 3, in <module>
        raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
    Exception: x 不能大于 5。x 的值为: 10
    raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。
    如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。
    举例:
    1 try:
    2     a = int(input('>>>>'))
    3 except ValueError:
    4     print('请输入一个数字!')
    5     raise 
    6 else:
    7     print('输入正确!')
    8 finally:
    9     print('Thank You!')
    执行结果:
    >>>>a
    请输入一个数字!
    Thank You!
    Traceback (most recent call last):
      File "D:/test_hub/learngit/post_test.py", line 67, in <module>
        a = int(input('>>>>'))
    ValueError: invalid literal for int() with base 10: 'a'
    五、用户自定义异常
    你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:
     1 class MyError(Exception):
     2     def __init__(self, value):
     3         self.value = value
     4 
     5     def __str__(self):
     6         return repr(self.value)
     7 try:
     8     raise MyError(2*2)
     9 except MyError as e:
    10     print('My exception occurred, value:', e.value)

    感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。 博主网址:http://www.cnblogs.com/beginner-boy/ 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:582238977@qq.com。 本博客为博主原创,欢迎转载,但必须注明博客来源。
  • 相关阅读:
    Mac os下安装pycurl
    Mac os 10.9下面配置JAVA_HOME
    同步,异步,阻塞,非阻塞
    Python处理XML
    Apriori算法在购物篮分析中的运用
    Python抓取双色球数据
    为什么这么多Python框架
    Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明
    ubuntu 开机自动挂载分区
    VIM 配置随手记
  • 原文地址:https://www.cnblogs.com/beginner-boy/p/14822594.html
Copyright © 2011-2022 走看看