python中的异常处理

0 基本概念

在Python中,有一个内置的异常处理模块称为try-except语句,用于捕获和处理异常。通过使用try-except语句,结合设计的代码来处理代码处理逻辑中可能引发的异常,从而使程序具有更好的容错性和健壮性。

下面是Python中用于异常处理的一些关键字和语句:

  1. try-except语句:try-except语句用于捕获和处理异常。代码块放在try语句中,如果发生异常,则会跳转到相应的except语句块进行处理。
try:
    # 这里书写功能代码1,当然此处的代码可能会引发异常(如类型不匹配,数据读取不成功等异常)
except ExceptionType:
    # 针对代码1中出现的异常进行处理特定的处理
except AnotherExceptionType:
    # 处理另一种类型的异常
else:
    # 如果没有发生异常,执行的代码
finally:
    # 无论是否发生异常,都会执行的清理代码
  1. except语句:except语句用于指定要捕获和处理的异常类型。可以指定多个except语句来处理不同类型的异常。如果发生与指定异常类型匹配的异常,则会执行相应的except语句块。

  2. else语句:else语句是可选的,用于指定当try语句中的代码没有引发异常时执行的代码块。

  3. finally语句:finally语句也是可选的,用于指定无论是否发生异常都会执行的清理代码块。通常在finally语句中释放资源或进行必要的清理操作。

  4. 异常类:Python提供了许多内置的异常类,例如ExceptionTypeErrorValueError等。当然还可以自定义自己的异常类来表示特定的错误情况。

下面是一个简单的示例,演示了try-except语句的使用:

try:
    num1 = int(input("请输入一个整数:"))
    num2 = int(input("请输入另一个整数:"))
    result = num1 / num2
    print("结果:", result)
except ValueError:
    print("输入的不是有效的整数!")
except ZeroDivisionError:
    print("除数不能为零!")
else:
    print("计算完成,没有发生异常。")
finally:
    print("程序结束。")

在上面的示例中,用户被要求输入两个整数,并进行除法运算。如果输入的不是整数,将引发ValueError异常;如果除数为零,将引发ZeroDivisionError异常。根据不同的异常类型,相应的except语句块会执行相应的处理操作。如果没有发生异常,将执行else语句块。无论是否发生异常,finally语句块中的代码都将执行。

这是Python中用于异常处理的基本知识。

1 在网络安全编程中的应用

使用Python代码来实现 MySQL未授权访问漏洞的检测,首先使用Python的MySQL连接库,如mysql-connector-pythonpymysql。下面是一个示例代码,用于检测MySQL未授权访问漏洞:

import pymysql

def check_mysql_unauthorized_access(host, port, username, password):
    try:
        # 连接到MySQL数据库
        connection = pymysql.connect(host=host, port=port, user=username, password=password)
        connection.close()
        return True
    except pymysql.err.OperationalError as e:
        if e.args[0] == 1045:  # 认证失败的错误码
            return False
        else:
            raise e

# 指定要检测的目标MySQL服务器的主机、端口、用户名和密码
target_host = 'localhost'
target_port = 3306
target_username = 'root'
target_password = ''

# 调用函数检测MySQL未授权访问漏洞
result = check_mysql_unauthorized_access(target_host, target_port, target_username, target_password)

if result:
    print("MySQL未授权访问漏洞存在")
else:
    print("MySQL未授权访问漏洞不存在")

在这个示例中,我们使用pymysql库来连接MySQL数据库。check_mysql_unauthorized_access函数尝试连接到目标MySQL服务器,如果连接成功,表示存在未授权访问漏洞;如果出现认证失败的错误,则表示漏洞不存在。在这个例子中可能所谓的异常是中间的功能代码区
在这里插入图片描述
异常情况如,数据库连接不成功,导致后面的其他代码无法正常进行(如connection.close())出现异常。为了在异常出现时能够及时进行提醒或处理,except模块就是异常处理的代码

2 重新引发异常 raise e

在给定的代码中 例子1,如果当前发生的错误不是1045错误(认证错误)。则使用语句raise e用于重新引发pymysql.err.OperationalError异常,(相当于把异常捕捉后存入变量e),这样后续的代码中,我们可以根据程序的需要对异常进一步处理,如再次使用try-except块捕获异常内处理异常,或者把重新引发异常交以由外部异常处理程序处理。

except`块内处理异常和重新引发异常的区别

当在try-except块内处理异常时,可以执行适当的错误处理操作,然后程序会继续执行后续的代码。这允许发生异常时采取措施来处理异常情况,而不会中断程序的执行。

以下是一个示例,演示了在except块内处理异常的情况:

try:
    result = 10 / 0  # 除以零会引发ZeroDivisionError异常
except ZeroDivisionError:
    print("除以零错误发生!")
    # 执行适当的错误处理操作,例如给出提示信息、记录日志等

print("程序继续执行...")

输出:

除以零错误发生!
程序继续执行...

在上面的示例中,当除以零引发ZeroDivisionError异常时,程序会进入except ZeroDivisionError块内。在该块内,我们打印出错误消息并执行适当的错误处理操作。然后,程序继续执行后续的代码,输出"程序继续执行…"。

相反,如果选择重新引发异常,异常将传播到更高级的异常处理程序,而不会在当前的try-except块中被处理。这允许其他部分的代码或更高级别的异常处理程序来捕获和处理异常。

以下是一个示例,演示了重新引发异常的情况:

def divide(a, b):
    try:
        result = a / b  # 除法操作可能引发ZeroDivisionError异常
    except ZeroDivisionError as e:
        print("除以零错误发生!")
        raise e  # 重新引发ZeroDivisionError异常

try:
    divide(10, 0)
except ZeroDivisionError:
    print("捕获到除以零错误!")

print("程序继续执行...")

输出:

除以零错误发生!
捕获到除以零错误!
程序继续执行...

在上面的示例中,函数divide尝试执行除法操作,但如果除数为零,则会引发ZeroDivisionError异常。在except ZeroDivisionError块内,我们打印出错误消息并重新引发相同的异常。然后,在调用divide函数的代码中,我们使用另一个try-except块来捕获并处理ZeroDivisionError异常。在此示例中,我们捕获到了重新引发的异常,并执行了相应的处理操作。最后,程序继续执行后续的代码,输出"程序继续执行…"。

总结起来,通过在except块内处理异常时,可以在发生异常时执行适当的处理操作并继续程序的执行。而通过重新引发异常,您可以将异常传播到更高级别的异常处理程序,以便由其他部分的代码或更高级别的处理程序来处理异常。

特别注意的是,重新引发异常raise 可以引发不同的异常。
重新引发异常时,我们可以选择引发不同的异常类型。这可以通过提供新的异常类或使用现有的异常类来实现。

以下是一个示例,演示了在重新引发异常时选择不同的异常类型:

def process_data(data):
    try:
        # 处理数据的操作
        result = int(data)
    except ValueError as e:
        print("数据处理错误!")
        raise TypeError("数据类型错误") from e

try:
    process_data("abc")
except TypeError as e:
    print("捕获到类型错误:", str(e))

print("程序继续执行...")

输出:

数据处理错误!
捕获到类型错误: 数据类型错误
程序继续执行...

在上面的示例中,函数process_data尝试将输入的数据转换为整数类型。如果无法将其转换为整数,将引发ValueError异常。在except ValueError块内,我们打印出错误消息并重新引发一个新的异常TypeError,将原始异常e作为新异常的原因。然后,在调用process_data函数的代码中,我们使用另一个try-except块来捕获并处理TypeError异常。在此示例中,我们捕获到了重新引发的异常,并打印出相应的错误消息。最后,程序继续执行后续的代码,输出"程序继续执行…"。

通过重新引发不同类型的异常,可以更精确地表示异常的性质和原因,并在处理异常时提供更多的上下文信息。这有助于提高代码的可读性和调试能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值