Python 异常的捕获和抛出细节
  TEZNKK3IfmPf 2023年11月15日 20 0

                  Python 异常的捕获和抛出细节

age = int(input("Age:"))
#输入年龄,整数类型
# try....except...finally  ===== 捕获异常
# raise ======   抛出异常
class AgeError(Exception):
#自定义的一个异常类,继承自Exception父类
    pass

if age < 0 or age > 120:
    raise  AgeError
#如果满足条件&#xff0c;抛出自定义类
else:
    print(age)
#不满足if条件&#xff0c;正常运行
  • except语句不是必须的&#xff0c;finally语句也不是必须的&#xff0c;但是二者必须要有一个&#xff0c;否则就没有try的意义了。

  • except语句可以有多个&#xff0c;Python会按except语句的顺序依次匹配你指定的异常&#xff0c;如果异常已经处理就不会再进入后面的except语句。

  • except语句可以以元组形式同时指定多个异常&#xff0c;参见下面的代码&#xff1a;

  • a=3
    b='a'
    try:
        print(a / b)
    except (ZeroDivisionError, TypeError) as e:
        print(e)
    #运行结果&#xff1a;
    #unsupported operand type(s) for /: 'int' and 'str'
    a=3
    b=0
    try:
        print(a / b)
    except (ZeroDivisionError, TypeError) as e:
        print(e)
    #运行结果&#xff1a;
    #division by zero

  • except语句后面如果不指定异常类型&#xff0c;则默认捕获所有异常&#xff0c;你可以通过logging或者sys模块获取当前异常。

  • 如果要捕获异常后要重复抛出&#xff0c;请使用raise&#xff0c;后面不要带任何参数或信息。

  • 不建议捕获并抛出同一个异常&#xff0c;请考虑重构你的代码。

  • 不建议在不清楚逻辑的情况下捕获所有异常&#xff0c;有可能你隐藏了很严重的问题。

  • 尽量使用内置的异常处理语句来替换try/except语句&#xff0c;比如with语句&#xff0c;getattr()方法。

  • 一般你在自定义异常类型时&#xff0c;需要考虑的问题应该是这个异常所应用的场景。如果内置异常已经包括了你需要的异常&#xff0c;建议考虑使用内置的异常类型。比如你希望在函数参数错误时抛出一个异常&#xff0c;你可能并不需要定义一个InvalidArgumentError&#xff0c;使用内置的ValueError即可。

  • 在Python中&#xff0c;为了保持异常的完整信息&#xff0c;那么你捕获后再次抛出时千万不能在raise后面加上异常对象&#xff0c;否则你的trace信息就会从此处截断。以下代码是最简单的重新抛出异常的做法&#xff0c;也是推荐的做法。

 

def f1():
    print(1/0)

def f2():
    try:
        f1()
    except Exception as e:
        raise  # don't raise e 

f2()
#抛出异常的作用是使程序按照我们需要的状态告诉我们错误在哪&#xff0c;从而追踪错误并排除它。

 

 

  • Exception的层级结构来看&#xff0c;BaseException是最基础的异常类&#xff0c;Exception继承了它。BaseException除了包含所有的Exception外还包含了SystemExit&#xff0c;KeyboardInterruptGeneratorExit三个异常。

  • 由此看来你的程序在捕获所有异常时更应该使用Exception而不是BaseException&#xff0c;因为被排除的三个异常属于更高级别的异常&#xff0c;合理的做法应该是交给Python的解释器处理。精确找到臭虫&#xff08;bug&#xff09;是一件好事情&#xff0c;因此&#xff0c;尽量别用baseexception&#xff0c;

  • 虽然&#xff0c;看起来你会省事&#xff0c;但对问题的定位帮助并不是很大。

  • def div(a, b):
        try:
            print(a / b)
        except ZeroDivisionError:
            print("Error: b should not be 0 !!")
        except Exception as e:
            print("Unexpected Error: {}".format(e))
        else:
            print('Run into else only when everything goes well')
        finally:
            print('Always run into finally block.')
    
    # tests
    div(2, 0)
    #会抛出哪个异常&#xff1f;猜猜看结果!
    div(2, 'bad type')
    #这个会抛出哪个异常&#xff1f;猜猜看结果&#xff01;
    div(1, 2)
    #这个不会抛出异常&#xff1f;猜猜看结果&#xff01;
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   32   0   0 python开发语言
  TEZNKK3IfmPf   2024年05月31日   25   0   0 python
  TEZNKK3IfmPf   2024年05月31日   25   0   0 python
TEZNKK3IfmPf