Python之异常处理

异常处理

  • 什么叫做"异常”

    1. 在程序运行过程中,总会遇到各种各样的问题和错误。
    2. 有些错误是我们编写代码时自己造成的:
      • 比如语法错误、调用错误,甚至逻辑错误。
    3. 还有一些错误,则是不可预料的错误,但是完全有可能发生的:
      • 比如文件不存在、磁盘空间不足、网络堵塞、系统错误等等。
    4. 这些导致程序在运行过程中出现异常中断和退出的错误,我们统称为异常。大多数的异常都不会被程序处理,而是以错误信息的形式展现出来。
      #0作为除数
      1/0
      
      #ZeroDivisionError: division by zero
      
  • 异常的危害:

    • 如果程序中一旦出现了异常的语句代码,则该异常就会立即中断程序的运行!
    • 因此:
      为了保证程序的正常运行,提高程序健壮性和可用性。我们应当尽量考虑全面,将可能出现的异常进行处理,而不是留在那里,任由其发生。
  • 异常的分类:

    • 异常有很多种类型,Python内置了几十种常见的异常,无需特别导入,直接就可使用。
    • 需要注意的是,所有的异常都是异常类,首字母是大写的!
    • 常见的异常类型:
      异常名解释
      AttributeError试图访问一个对象没有的属性
      IOError输入/输出异常
      ImportError无法引入模块或包;多是路径问题或名称错误
      IndentationError缩进错误
      IndexError下标索引错误
      KeyError试图访问不存在的键
      KeyboardInterruptCtrl+C被按下,键盘终止输入
      NameError使用未定义的变量
      SyntaxError语法错误
      TypeError传入对象的类型与要求的不符合
      UnboundLocalError试图访问一个还未被设置的局部变量
      ValueError传入一个调用者不期望的值,即使值的类型是正确的
      OSError操作系统执行错误
  • python处理异常的机制:

    • Python内置了一套try…except…finally(else)…的异常处理机制,来帮助我们进行异常处理。其基本语法是:
      try:
          pass
      except Exception:
          pass
      
    • 机制说明:
      • 首先,执行try子句(在关键字try和关键字except之间的语句)
      • 如果没有异常发生,忽略except子句,try子句执行后结束。
      • 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。
      • try:
            print('123')
            a = 1/0
        except Exception as e:
            print(e)
        print('after except!')
        
      • try :
            num = eval(input("请输入一个整数: "))
            print(num**2)
        except NameError:
            print("输入不是整数")
         # NameError 标注异常类型后,仅响应此异常 异常类型名字等同于变量
        
    • 如果程序发生的异常不在你的捕获列表中,那么依然会抛出别的异常:
    • try:
          print('123')
          a = 1/0
      except IndexError as e:
          print(e)
      
      print('after except!')
      
    • Exception是什么?
      • 在Python的异常中,有一个通用异常:Exception,它可以捕获任意异常。
      • 思考:那么既然有这个什么都能管的异常,其他诸如OSError、ZeroDivisionError的异常是不是就可以不需要了?
        • 当然不是!很多时候程序只会弹出那么几个异常,没有必要针对所有的异常进行捕获(牛刀杀鸡),那样的效率会很低(Exception占用资源量大)。
        • 另外,根据不同的异常种类,制定不同的处理措施,用于准确判断错误类型,存储错误日志,都是非常有必要甚至强制的。
  • Python的异常机制具有嵌套处理的能力:

    • 比如在函数f3()调用f2(),f2()调用f1(),虽然是在f1()出错了,但只需要在f3()进行异常捕获,不需要每一层都捕获异常
    • def f1():
          a = 1/0
      
      def f2():
          print('f2')
          f1()
      
      def f3():
          print('f3')
          f2()
      
      f3()
      
    • 函数嵌套处理异常:
      def f1():
          a = 1/0
      
      def f2():
          print('f2')
          f1()
      
      def f3():
          print('f3')
          f2()
      
      try:
          f3()
      except Exception as e:
          print(e)
      
  • try…excetion的嵌套

    • 之前我们说过,不是只使用通用的异常类Exception就万事大吉了,为了效率问题,我们需要对常见的异常信息进行精准的捕获,那么如果异常出现在用户层的话,则就需要对用户操作可能会出现的异常进行判断然后精准捕获了,如何操作呢?
      • 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。也就是前面说的嵌套处理能力。直到程序最顶端如果还没有被捕获,那么将弹出异常。
        try:
            try:
                a = 1/0
            except IndexError as e:
                print(e)
        except ZeroDivisionError as e:
            print(e)
        
      • 或者使用一个try和多个except的形式:
        try:
            a = 1/0
        except IndexError as e:
            print(e)
        except ZeroDivisionError as e:
            print(e)
        
      • 或者在except后面跟一个元组,元组中包含多个异常类
      • try:
            a = 1/0
        except (IndexError,ZeroDivisionError):
            print('error')
        
  • finally和else子句

    • try except语法还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后。这个子句将在try子句没有发生任何异常的时候执行
    • finally对应语句块一定执行 else对应语句块在不发生异常时执行
      try:
          a = 1/1
      except ZeroDivisionError:
          print('error')
      else:
          print('else')
      finally:
          print('finally')
      
  • 主动抛出异常:raise

    • 很多时候,我们需要主动抛出一个异常。Python内置了一个关键字raise,可以主动触发异常。
    • 疑问:
      • 为什么要自己主动抛出异常?不嫌多事么?
        • 有时候,你需要主动弹出异常,作为警告或特殊处理
          • 程序设计的时候,要考虑到用户使用程序时可能会触发的各种各样的操作,其实有些操作对于程序而言是不合法的,则需要在不合法的位置主动抛出异常,提醒用户的违法操作。
          #用户录入自己的性别:1表示男,2表示女
          class MyErr(Exception):
              def __init__(self,msg):
                  self.msg = msg
              def __str__(self):
                  return self.msg
          
          
          sex = input('enter you sex:')
          if sex == '3':
              raise MyErr('您的性别有误!!!')
          else:
              print('right')
          
          • 更多的时候,需要使用raise抛出你自定义的异常!
  • 自定义异常

    • 我们已将在前面看到了python内置的一些常见的异常类型。大多数情况下,内置异常已经够用了。
    • 但是有时候你还是需要自定义一些异常:
      • 自定义异常应该继承Exception类,直接继承或者间接继承都可以,例如:
        class MyErr(Exception):
            def __init__(self,msg):
                self.msg = msg
            def __str__(self):
                return self.msg
        
        err = MyErr('find error range')
        print(err)
        
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我知道你的问题了。那么关于 Python异常处理 try/except 语句和判断整数的问题,我可以为您解答。 在 Python 中,异常处理是一种非常重要的编程技巧,可以帮助我们在程序出现错误时做出相应的处理,避免程序崩溃或出现不可预料的结果。其中,try/except 语句是 Python 中用来捕获异常的一种关键字,其基本语法如下: ``` try: # 可能会出现异常的代码块 except 异常类型1: # 处理异常类型1的代码块 except 异常类型2: # 处理异常类型2的代码块 ... else: # 没有异常发生时执行的代码块 finally: # 无论是否有异常都会执行的代码块 ``` 在这里,我们可以使用 try/except 语句来判断一个字符串是否能够转换为整数。例如: ``` try: num = int(input("请输入一个整数:")) print("输入的整数是:", num) except ValueError: print("输入的不是整数!") ``` 在这个例子中,我们使用 int() 函数将用户输入的字符串转换为整数。如果用户输入的是一个非数字字符串,那么就会抛出 ValueError 异常,我们就可以在 except 块中进行相应的处理。 至于判断一个字符串是否能够转换为整数,我们可以使用 Python 中的 isdigit() 方法,将其与 try/except 语句结合使用。例如: ``` num_str = input("请输入一个数字字符串:") if num_str.isdigit(): num = int(num_str) print("转换后的整数是:", num) else: print("输入的不是数字字符串!") ``` 在这个例子中,我们首先使用 isdigit() 方法判断用户输入的字符串是否都是数字字符,如果是,就可以使用 int() 函数将其转换为整数;否则,就输出相应的提示信息。 希望这些解答能够对您有所帮助,如有疑问请随时追问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值