【python基础知识】异常处理:try-except、try-except-else-finally、与自定义异常

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

一. 异常结构

1. try-except

ZeroDivisionError异常例子

if __name__ == '__main__':
    try:
        print(5 / 0)
    except ZeroDivisionError:
        print("You can't divide by zero!")

FileNotFoundError异常例子

filename = 'alice.txt'

try:
    with open(filename, encoding='utf-8') as f:
        contents = f.read()
except FileNotFoundError:
    print(f"Sorry, the file {filename} does not exist.")

 

2. try-except-else

通过将可能引发错误的代码放在try-except代码块中,可提高程序抵御错误的能力。依赖try代码块成功执行的代码都应放到else代码块中,如下:

if __name__ == '__main__':
    filename = 'alice1.txt'

    try:
        with open(filename, encoding='utf-8') as f:
            contents = f.read()
    except FileNotFoundError:
    # 这里并没有抛出异常
        print(f"Sorry, the file {filename} does not exist.")
    else:
    # 计算该文件大致包含多少个单词。
         words = contents.split()
         num_words = len(words)
         print(f"The file {filename} has about {num_words} words.")

 

3. try-except-else-finally

finally块用于回收在try块里打开的物理资源,不管有没有异常,finally中的代码块总被执行。

try:
    num = int(input("请输入整数:"))
    result = 8 / num
    print(result)
except ValueError:
    print("请输入正确的整数")
except ZeroDivisionError:
    print("除 0 错误")
except Exception as result:
    print("未知错误 %s" % result)
else:
    print("正常执行")
finally:
    print("执行完成,但是不保证正确")

 

4. raise主动抛出异常(throw new)

def functionName(level):
    if level < 1:
        # 执行到这一句就会抛出这个异常
        raise Exception("Invalid level!", level)
        # 触发异常后,后面的代码就不会再执行
    print("异常后不会执行啦!")

functionName(0)

 

5. 静默失败:pass

有时候你希望程序在发生异常时保持静默,就像什么都没有发生一样继续运行。

  def count_words(filename):
      """计算一个文件大致包含多少个单词。"""
      try:
          --snip--
      except FileNotFoundError:
          pass
      else:
          --snip--

  filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
  for filename in filenames:
      count_words(filename)

现在,出现FileNotFoundError异常时,将执行except代码块中的代码,但什么都不会发生。这种错误发生时,不会出现traceback,也没有任何输出。用户将看到存在的每个文件包含多少个单词,但没有任何迹象表明有一个文件未找到。

 

二. 自定义异常

自定义异常一般继承与Exception或BaseException。

class ShortInputException(Exception):
    def __init__(self, length, least_length):
        super().__init__()
        self.length = length
        self.least_length = least_length

    def __str__(self):
        return '您输入的长度为:{},最短长度为:{}'.format(self.length, self.least_length)


try:
    content = input('请输入内容:')
    if len(content) < 5:
        raise ShortInputException(len(content), 5)
    else:
        print('符合要求')
except ShortInputException as e:
    print(e)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值