1 Assert

1.1 含义与用法

给出一个判断条件,如果条件满足,则继续执行;如果条件不满足,则直接报错(AssertionError)
常用于代码调试,更方便地定位出错的位置
例如:

def  zero(s):
    a = int(s)
    assert a > 0,"a超出范围"   # 如果a确实大于0,程序正常往下运行(可在判断条件的逗号后添加错误描述)
    return a

zero("-2")  #但是如果a是小于0的,程序会抛出AssertionError错误,报错为参数内容“a超出范围”

运行结果:

Traceback (most recent call last):
  File "e:\Python_list\class_student\temp.py", line 6, in <module>
    zero("-2")
  File "e:\Python_list\class_student\temp.py", line 3, in zero
    assert a > 0,"a超出范围"
AssertionError: a超出范围

注意:
如果写成assert(False, "Error")形式不会报错,但是永不会执行,因为此时判断条件为 (False, "Error"),是一个元组,即只有为空的时候才会返回False

1.2 assert的启用和禁用

Python解释器在运行时有两种模式:

  • 启用: 调试模式,该模式下,内置只读变量__debug__为True。
  • 禁用: 优化模式,当使用选项-O运行时,即python.exe -O demo.py为优化模式,内置只读变量__debug__为False

2 try

2.1 含义与用法

整体由:try…except, else, finally 组成:

#  try语句的使用
try:
    print("程序正常运行。。。")
except KeyError:
    print('key error错误。。。')
else:
    print("程序未产生异常时则运行当前代码。。。")
finally:
    print("程序无论是否出现异常都执行此语句。。。")
  • try:用来估计错误;程序先执行try里的内容
  • except:用来捕获异常并执行此部分的程序;try中的代码执行有误时:
    • 如果except后没有判断条件,则直接执行except内代码
    • 如果有判断条件,且try内出现的错误类型与判断条件出设定的错误类型一致,则执行except内代码,判断条件的设置方式如下:
# 捕获异常的不同情况
try:
   print(num)
except NameError:  # 只设置捕获一种错误类型的情况
   print('有错误')

try:
   print(1/0)
except (NameError, ZeroDivisionError):  # 设置捕获多种错误类型的情况
   print('有错误')

try:
   print(num)
except (NameError, ZeroDivisionError) as result:  # 捕获异常描述信息(仅用于捕获)
   print(result)

try:
   print(num)
except Exception as result:  # 捕获所有的异常(Exception是所有程序异常类的⽗类)
   print(result)
    
# ---------------多个except的情况---------------

try:
        tmp = tmp / 0
        print(num)  # ⼀般try下⽅只放⼀⾏尝试执⾏的代码,出现异常的语句后,下面的语句不再执行
        tmp = tmp + 1
    except NameError as e:
        print(e)
    except ZeroDivisionError as e:
        print(e)
    except Exception as e:
        print(e)
    else:
        print("I am OK!")
    finally:
        print("End the program!")
    return tmp
  • else:如果没有被捕获的异常,则执行else中的代码
  • finally:无论是否异常,都必执行的代码(例如f.close()

2.2 raise的用法

共有三种用法:

  1. raise
  2. raise exceptionName
  3. raise exceptionName (reason)

程序运行到raise后直接抛出一个异常,供相关语句处理或直接停止运行

2.2.1 单独一个raise

  • 如果上文没有异常,则触发RuntimeError
  • 如果上文已经有异常了,则重新触发前一个异常,如果之前没有触发异常,触发RuntimeError
def test(num):
    try:
        100/num
    except Exception as res:
        print("捕获异常完成")
        raise  
test(0)

2.2.2 raise 异常名

抛出指定类型的异常

def Test1(num):
    try:
        100/num
    except Exception as res:
        print("捕获异常完成")
        print(res)
        raise ZeroDivisionError
        print("----在raise之后,不会执行-----")
    else:
        print("没有异常")
Test1(0)

也可以抛出自定义的异常:

class CustomException(Exception):
    def __init__(self,ErrorInfo):
        self.ErrorInfo = ErrorInfo
    def __str__(self):
        return self.ErrorInfo
def Test1(num):
    try:
        raise CustomException('这是一个自定义的异常')
    except CustomException as res:
        print(res)
Test1(0)

image.png
思考:except可以跟raise一起组合使用:
except负责启动执行包含raise的这一部分代码,并且收集错误的类型,raise负责抛出指定类型的异常。对于异常的处理过程而言,这种逻辑类似于except负责记录,raise负责具体执行。

2.2.3 raise 异常名(描述信息)

def Test1(num):
    try:
        100/num
    except Exception as res:
        print("捕获异常完成")
        print(res)
        raise ZeroDivisionError("分母不能为0")
        print("----在raise之后,不会执行-----")
    else:
        print("没有异常")
Test1(0)

image.png

2.3 自定义异常

需要继承Exception

# ⾃定义异常类,继承Exception
class ShortInputError(Exception):
    def __init__(self, length, min_len):
        self.length = length
        self.min_len = min_len
 
    # 设置抛出异常的描述信息
    def __str__(self):
        return f'您输⼊的⻓度是{self.length}, 不能少于{self.min_len}个字符'
 
 
def main():
    try:
        con = input('请输⼊密码:')
        if len(con) < 3:
            raise ShortInputError(len(con), 3)
    except Exception as result:
        print(result)
    else:
        print('密码已经输⼊完成')
 
 
main()
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐