075、Python 关于异常处理try-except语句的使用

发布于:2024-07-02 ⋅ 阅读:(14) ⋅ 点赞:(0)

在实际应用中,比如涉及文件读写、网络通信时,会因为文件不存在、权限不够、网络异常等原因引发异常,或者对数据库连接、查询、更新等操作,会因为连接超时、语法错误、唯一约束冲突等引发异常。

在Java或C#等语言中我们使用try-catch语句来捕捉异常,而在Python中,异常处理使用的是try-except语句。虽然使用不同关键字,但是应用思维大同小异。

下面详细看下Python中的try-except语句。

1、基本语法:

try:  
    # 尝试执行的代码块  
    # 这里放可能会引发异常的代码  
except ExceptionType1:  
    # 如果try块中的代码引发了ExceptionType1异常,则执行此块  
    # 处理ExceptionType1异常的代码  
except ExceptionType2:  
    # 如果try块中的代码引发了ExceptionType2异常,则执行此块  
    # 处理ExceptionType2异常的代码  
# ... 可以有多个except子句来处理不同类型的异常  
except Exception as e:  
    # 捕获所有未被特定except子句捕获的异常  
    # 处理异常的通用代码  
    print(f"An error occurred: {e}")  
else:  
    # 如果没有异常发生,则执行此块  
    # 通常用于执行依赖于try块成功执行的代码  
    print("No exception was raised")  
finally:  
    # 无论是否发生异常,都会执行此块  
    # 通常用于执行清理操作,如关闭文件或释放资源  
    print("This block will always be executed")

在上面的语法中:

  • try块包含可能会引发异常的代码。
  • except块用于捕获并处理特定的异常。可以有多个except子句,每个子句处理不同类型的异常。
  • ExceptionType1, ExceptionType2等是要捕获的异常类型。这些异常可以是内置异常类型(如ValueError, TypeError, ZeroDivisionError等)或自定义异常类型的名称。
  • Exception是一个通用的异常类,可以捕获所有未被特定except子句捕获的异常。使用as e可以将捕获的异常对象绑定到变量e上,以便在except块中引用它。
  • else块是可选的,当try块中的代码成功执行而没有引发异常时,会执行else块中的代码。
  • finally块也是可选的,但无论是否发生异常,它都会执行。通常用于执行清理操作,如关闭文件、释放资源等。

2、常见用法:

1、捕捉特定异常:

def divide_numbers(a, b):  
    try:  
        result = a / b  
        return result  
    except ZeroDivisionError:  
        print("Error: Division by zero is not allowed.")  
        # 这里可以选择返回一个值,抛出一个新的异常,或者做其他处理  
        return None  
  
# 测试
print(divide_numbers(10, 2))  # 输出: 5.0  
print(divide_numbers(10, 0))  # 输出: Error: Division by zero is not allowed.
  • 具体特定的异常常见的有:
名称 说明
ValueError 传入无效的参数。
TypeError 对类型无效的操作。
Warning 警告。
SyntaxError 语法错误。
RuntimeError 运行时错误。
ReferenceError 引用错误。
ImportError 导入失败。
LookupError 无效数据查询的基类。
OSError 操作系统错误。

2、处理多个异常类型:

try
{
    int result = Divide(10, 0); // 除以0的异常
    print("结果:" + result);
}
except DivideByZeroException as e:
{
    print("除以0异常:" + e.Message);
}
except ArithmeticException as e
{
    print("算术异常:" + e.Message);
}

3、文件操作:

当读取或写入文件时,可能会出现文件不存在、没有权限等异常情况。

try:  
    with open('example.txt', 'r') as file:  
        content = file.read()  
except FileNotFoundError:  
    print("文件不存在!")  
except PermissionError:  
    print("没有权限读取文件!")  
except Exception as e:  
    print(f"发生了一个错误: {e}")

4、网络请求

在发送HTTP请求时,可能会因为网络问题或服务器错误而失败。

import requests  
  
try:  
    response = requests.get('http://example.com')  
    response.raise_for_status()  # 如果响应状态码不是200,则抛出HTTPError异常  
    print(response.text)  
except requests.exceptions.HTTPError as errh:  
    print("Http Error:", errh)  
except requests.exceptions.ConnectionError as errc:  
    print("Error Connecting:", errc)  
except requests.exceptions.Timeout as errt:  
    print("Timeout Error:", errt)  
except requests.exceptions.RequestException as err:  
    print("Something Else", err)

5. 用户输入验证

在接收用户输入时,可能需要进行一些验证,以确保输入是有效的。

try:  
    age = int(input("请输入你的年龄: "))  
    if age < 0:  
        raise ValueError("年龄不能是负数!")  
except ValueError as e:  
    print(e)  
except Exception as e:  
    print("发生了一个错误:", e)

6. 数据库操作

与数据库交互时,可能会遇到连接失败、查询错误等问题。

import sqlite3  
  
try:  
    # 连接到SQLite数据库(如果数据库不存在,则会自动在当前目录创建)  
    conn = sqlite3.connect('example.db')  
    c = conn.cursor()  
      
    # 执行SQL命令  
    c.execute('''CREATE TABLE stocks  
                 (date text, trans text, symbol text, qty real, price real)''')  
except sqlite3.Error as e:  
    print(e)  
finally:  
    if (conn):  
        conn.close()