异常

异常介绍

如果代码没有语法问题,可以运行,但会出运行时的错误,例如除零错误,下标越界等问题,这种在运行期间检测到的错误被称为异常。

出现了异常必须处理,否则程序会终止执行,用户体验会很差。

Phthon 支持程序员自己处理检测到的异常,可以使用 try-except 语句进行异常的检测和处理。

image

1、首先执行 try 中【代码块A】,如果出现异常,立即终止代码执行,转而到 except 块中进行异常处理

2、异常处理 except 模块可以多个,从上往下匹配,如果能够匹配成功,立即执行相应的异常处理代码块,执行完毕后,不在往下匹配,转到3执行

3、执行异常处理完毕后,如果有 finally 字句则执行 finally 字句,如果没有则执行【后续语句】

4、如果匹配不到异常,有 finally 则执行 finally,然后则抛出错误,终止程序执行。

5、如果没有异常,如果有 else 字句则执行 else 字句,执行完 else 后,有 finally 字句则执行,没有则执行【后续语句】

finally 语句可有可无,但是如果有的话,则一定会执行,不论有异常与否。

else 语句也是可有可无,如果写了 else 语句,则 else 仅当无异常时才会执行。

except 后面如果不能异常类型,就是默认的 except,必须写在一系列的 except 最后一个,这个 except 可以捕获所有的异常。

try-except

程序示例:

try:
    print("可能出错的代码")
except:
    print("异常处理代码")

结果:

可能出错的代码

程序示例:

try:
    print("可能出错的代码")
    print(1 + "1")
except:
    print("异常处理代码")

结果:

可能出错的代码
异常处理代码

程序示例:

try:
    print("可能出错的代码")
    n = int(input("Enter a number: "))
    m = 10 / n
    print(m)
except:
    print("异常处理代码")

结果:

可能出错的代码
Enter a number: 0
异常处理代码

没有用 try-except 的程序:

程序示例:

n = input("Enter a number: ")
if n.isdigit():
    n = int(n)
    if n != 0:
        m = 5 / n
    else:
        print("divide cannot be zero")
else:
    print("Enter a number")

结果 1:

Enter a number: 0
divide cannot be zero

结果 2:

Enter a number: a
Enter a number

用 try-except 改造后的程序:

程序示例:

try:
    n = int(input("Enter a number: "))  # 如果转不成数字,则会执行 except 语句
    if n != 0:
        m = 5 / n
    else:
        print("divide cannot be zero")
except:
    print("Enter a number")

结果:

Enter a number: a
Enter a number

进一步改造:

程序示例:

try:
    n = int(input("Enter a number: "))  # 如果转不成数字,则会执行 except 语句
    m = 5 / n
except ZeroDivisionError:
    print("divide cannot be zero")
except ValueError:
    print("Enter a number")

进一步改造:

程序示例:

try:
    n = int(input("Enter a number: "))  # 如果转不成数字,则会执行 except 语句
    m = 5 / n
except ZeroDivisionError as e:
    print("divide cannot be zero")
    print("原始报错信息", e)
except ValueError as e:
    print("Enter a number")
    print("原始报错信息", e)

结果:

Enter a number: d
Enter a number
原始报错信息 invalid literal for int() with base 10: 'd'

结果:

Enter a number: 0
divide cannot be zero
原始报错信息 division by zero

raise

程序示例:

password = input('Enter your password: ')
if len(password) < 8:
    print('Password must be at least 8 characters')
else:
    print('Password is valid')

这样写其实并不好,异常应该由专门用来处理异常的语句来处理,if else 语句应该只用来处理业务逻辑。

优化:

程序示例:

try:
    password = input('Enter your password: ')
    if len(password) < 8:
        raise Exception('Password must be at least 8 characters')
except Exception as e:
    print(e)
else:
    print('Password is valid')

结果 1:

Enter your password: 11111111111
Password is valid

结果 2:

Enter your password: 1
Password must be at least 8 characters

简易计算器

image

程序示例:

def add_op(op):
    list1 = op.split("+")
    a = int(list1[0])
    b = int(list1[1])
    return a + b


def subtraction_op(op):
    list1 = op.split("-")
    a = int(list1[0])
    b = int(list1[1])
    return a - b


def multiplication_op(op):
    list1 = op.split("*")
    a = int(list1[0])
    b = int(list1[1])
    return a * b


def division_op(op):
    list1 = op.split("/")
    a = int(list1[0])
    b = int(list1[1])
    return a / b


while True:
    try:
        operation = input("Enter operation: ")
        if "+" in operation:
            result = add_op(operation)
            print(result)
        elif "-" in operation:
            result = subtraction_op(operation)
            print(result)
        elif "*" in operation:
            result = multiplication_op(operation)
            print(result)
        elif "/" in operation:
            result = division_op(operation)
            print(result)
        elif "C" in operation:
            print("感谢使用本计算器")
            break
        else:
            raise Exception("请按照1+2的格式来输入")
    except ZeroDivisionError:
        print("除数不能为零")
    except Exception as e:
        print(e)
posted @ 2025-11-04 23:48  YouKong  阅读(2)  评论(0)    收藏  举报