【Python面试笔记】1.8.1 基础语法 错误与异常处理 try、except、else、finally、自定义异常

部署运行你感兴趣的模型镜像

在 Python 中,错误与异常处理是非常重要的机制,它允许程序在遇到错误时不直接崩溃,而是提供一种捕获、处理和恢复的方式;异常处理可以让程序更加健壮,提高用户体验

1. 错误与异常

  • 错误(Error):通常指程序中的问题,通常会导致程序停止运行

    • 语法错误(SyntaxError):代码的语法不符合规定
    • 逻辑错误(LogicalError):代码运行时的行为不符合预期
  • 异常(Exception):是错误的一种类型,在 Python 中,异常是可以被捕捉和处理的;异常会中断程序的执行,但是我们可以通过捕捉并处理异常,避免程序崩溃

2. 异常处理机制

Python 使用 tryexceptelsefinally 等关键字来处理异常

2.1 try 和 except

try 块用于包含可能会抛出异常的代码;如果 try 块中的代码出现异常,Python 会跳转到相应的 except 块来处理该异常

语法

try:
    # 可能抛出异常的代码
except ExceptionType as e:
    # 处理异常的代码

示例

try:
    x = 1 / 0  # 除零错误
except ZeroDivisionError as e:
    print("Error:", e)  # 输出错误信息

输出:

Error: division by zero

2.2 else 和 finally
  • else:如果 try 块中的代码没有抛出异常,else 块将会执行
  • finally:不论是否发生异常,finally 块中的代码都会被执行;通常用于进行清理工作(如关闭文件或数据库连接)

语法

try:
    # 可能会抛出异常的代码
except ExceptionType as e:
    # 处理异常的代码
else:
    # 如果没有异常,执行此代码
finally:
    # 不论是否发生异常,执行此代码

示例

try:
    x = 10 / 2
except ZeroDivisionError as e:
    print("Error:", e)
else:
    print("No error occurred.")
finally:
    print("This block is always executed.")

输出:

No error occurred.
This block is always executed.

2.3 捕获多个异常

可以在一个 except 块中捕获多个异常,或者使用多个 except 块分别处理不同类型的异常

示例 1: 捕获多个异常类型:

try:
    num = int(input("Enter a number: "))
    result = 10 / num

'''input("Enter a number: "):首先,程序提示用户输入一个数字
input() 函数返回的是字符串类型

int(input(...)):将用户输入的字符串转换为整数
如果用户输入的内容无法转换为整数(例如,输入了字母或其他非法字符),
就会抛出 ValueError 异常

result = 10 / num:然后,程序尝试用 10 除以用户输入的数字 num
如果 num 是 0,程序会抛出 ZeroDivisionError 异常'''

except (ValueError, ZeroDivisionError) as e:
    print(f"Error: {e}")

'''except (ValueError, ZeroDivisionError):
这里,except 捕获了两种类型的异常:ValueError 和 ZeroDivisionError

ValueError:当用户输入不能转换为整数时触发
(例如,输入了字母或者其他无法转换为整数的字符串)

ZeroDivisionError:
当用户输入 0 时触发,因为除以零在数学上是不可行的,会抛出该异常

as e:将捕获的异常赋值给变量 e,这样就可以获取异常的具体信息

print(f"Error: {e}"):打印出捕获到的异常信息
e 会包含异常的描述信息,
例如:“invalid literal for int() with base 10: 'abc'” 或者 “division by zero”

input() 函数是 Python 中用于从用户获取输入的内置函数
它会暂停程序的执行,等待用户输入,并返回用户输入的内容(作为字符串)

基本用法
user_input = input("Please enter something: ")
print(f"You entered: {user_input}")

input(prompt):prompt 是一个可选参数,它用于向用户显示提示信息
在用户输入内容之前,提示信息会被打印出来

返回值:input() 总是返回一个字符串类型的结果,无论用户输入的是数字、字符还是其他内容
因此,如果你需要将输入转换为其他类型(如整数或浮点数),
需要使用类型转换函数,例如 int() 或 float()

示例
获取用户输入并打印:
name = input("Enter your name: ")
print(f"Hello, {name}!")

如果用户输入的是 Alice,输出将是:
Hello, Alice!

将输入转换为整数:
age = int(input("Enter your age: "))
print(f"You are {age} years old.")
如果用户输入的是 25,输出将是:
You are 25 years old.

处理输入为浮点数:
height = float(input("Enter your height in meters: "))
print(f"Your height is {height} meters.")
如果用户输入的是 1.75,输出将是:
Your height is 1.75 meters.

特点
输入的内容总是字符串:无论用户输入什么内容,input() 返回的都是一个字符串
如果需要将输入转换为其他数据类型,需要显式转换(如 int() 或 float())

阻塞等待用户输入:input() 会暂停程序执行,直到用户提供输入并按下回车键

在 Python 2.x 中,input() 会执行输入的代码,而 raw_input() 才是获取用户输入的正确方法
但在 Python 3.x 中,input() 始终返回字符串'''

示例 2: 分别捕获不同类型的异常:

try:
    num = int(input("Enter a number: "))
    result = 10 / num
except ValueError as e:
    print("Invalid input, not a number.")
except ZeroDivisionError as e:
    print("Can't divide by zero.")
except Exception as e:
    print("An unexpected error occurred:", e)

2.4 获取异常信息

except 块中,使用 as 关键字来捕获异常对象,并可以访问异常的详细信息

示例

try:
    x = 1 / 0
except ZeroDivisionError as e:
    print("Caught exception:", e)

输出:

Caught exception: division by zero

2.5 自定义异常

Python 允许用户创建自定义异常类型;你可以通过继承 Exception 类来创建自己的异常

示例

class MyCustomError(Exception):
    def __init__(self, message):
        super().__init__(message)

'''class MyCustomError(Exception):
这行代码定义了一个名为 MyCustomError 的新异常类
它继承自 Python 内置的 Exception 类
Exception 类是所有内置异常的基类,也可以作为创建自定义异常类的基类
它有一个构造方法 __init__,用于接收错误信息并将其存储,
以便在异常被抛出时可以显示该信息

def __init__(self, message):
这是该异常类的构造方法(初始化方法),接受一个 message 参数
这个参数将是一个字符串,用于描述异常的原因或错误信息

super().__init__(message):
super() 调用的是父类 Exception 的构造方法
通过调用 super().__init__(message),
将 message 传递给 Exception 类的构造函数,
这样异常实例就可以保存该消息并在异常被触发时显示出来'''

try:
    raise MyCustomError("Something went wrong!")
except MyCustomError as e:
    print("Caught custom exception:", e)

'''try::try 块用于包含可能引发异常的代码
在这里,try 块中有一行代码显式地引发了一个 MyCustomError 异常

raise MyCustomError("Something went wrong!"):
raise 关键字用于主动触发异常
在这个例子中,代码会引发一个 MyCustomError 类型的异常,
并附带了错误消息 "Something went wrong!"

except MyCustomError as e:
except 块用于捕获并处理特定类型的异常
这里的 except 捕获了 MyCustomError 类型的异常,
并将异常实例赋值给变量 e
这样,就可以在后续代码中访问该异常对象

print("Caught custom exception:", e):
在 except 块中,print 语句打印出异常的信息,e 代表捕获到的异常对象
由于 MyCustomError 类继承自 Exception 类,
所以 e 包含了 MyCustomError 异常的错误消息,
也就是 "Something went wrong!"'''

输出:

Caught custom exception: Something went wrong!

2.6 try 和 except 的嵌套

tryexcept 块可以嵌套使用,用于更复杂的异常处理场景

示例

try:
    try:
        x = 10 / 0
    except ZeroDivisionError as e:
        print("Inner exception:", e)
        raise  # 重新抛出异常

'''内层 try 块的代码尝试执行 x = 10 / 0,这是一个除以零的操作,
因此会抛出一个 ZeroDivisionError 异常
异常被 except ZeroDivisionError as e 捕获,进入 except 块
在 except 块中,print("Inner exception:", e) 
会打印 "Inner exception: division by zero",
这就是 Python 抛出的 ZeroDivisionError 异常的消息
然后,raise 语句会重新抛出当前捕获的异常(ZeroDivisionError)
这意味着异常会被再次传递给外层 except 块进行处理'''

except Exception as e:
    print("Outer exception:", e)

'''外层 try 块试图执行一些代码
如果内层代码块(包括内层的异常处理)出现任何未被处理的异常,
外层 except 会捕获这些异常并打印出相关的错误信息

外层 except 块捕获所有类型的异常(通过 Exception 类)
因为内层的异常被重新抛出并传递到外层,
外层 except 会接收到 ZeroDivisionError 异常
然后,print("Outer exception:", e) 会打印外层异常的消息
由于异常是 ZeroDivisionError,
打印的内容会是 "Outer exception: division by zero"'''

输出:

Inner exception: division by zero
Outer exception: division by zero

3. 常见异常类型

Python 内置了很多常见的异常类型,以下是一些常见的异常类型:

  • ValueError:参数值不正确时抛出
  • IndexError:访问列表、元组等序列时索引超出范围
  • KeyError:字典中访问不存在的键时抛出
  • TypeError:数据类型不匹配时抛出
  • FileNotFoundError:文件没有找到时抛出
  • ZeroDivisionError:除以零时抛出
  • AttributeError:对象没有该属性时抛出
  • IOError:输入输出操作异常

4. 总结

  • try:用于包裹可能抛出异常的代码
  • except:捕捉并处理异常,可以指定异常类型,也可以捕捉所有异常
  • else:如果没有异常发生,则执行 else 块
  • finally:无论是否发生异常,finally 块总会执行,常用于清理工作
  • 自定义异常:可以自定义异常类型,通过继承 Exception 类

通过异常处理,Python 程序能够更加健壮,避免因错误导致程序崩溃;它是一个非常重要的编程工具,尤其在处理外部输入、文件操作、数据库访问等环节时尤其重要

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值