首页 > 后端开发 > Python教程 > 使用Python处理专业错误

使用Python处理专业错误

Jennifer Aniston
发布: 2025-03-04 10:58:19
原创
373 人浏览过

在本教程中,您将从整个系统的角度学习如何处理Python中的错误条件。错误处理是设计的关键方面,它从最低级别(有时是硬件)一直到最终用户。如果您没有一致的策略,您的系统将不可靠,用户体验将很差,您将面临很多挑战,并且要调试和故障排除。状态代码和异常。状态代码可以由任何编程语言使用。异常需要语言/运行时支持。

python支持异常。 Python及其标准图书馆使用例外情况,可以自由地报告许多特殊情况,例如IO错误,除以零,不超出界限,以及一些不太特殊的情况,例如迭代的终结(尽管隐藏了)。大多数库都遵循并提出例外。

这意味着您的代码无论如何都必须处理Python和库提出的例外,因此您不妨在必要时从代码中提出异常,而不是依赖状态代码。

>

快速示例

>

>

>

这是调用try

子句时的输出。如果没有例外,则该程序会跳过
def f():<br>    return 4 / 0<br>def g():<br>    raise Exception("Don't call us. We'll call you")<br>def h():<br>    try:<br>        f()<br>    except Exception as e:<br>        print(e)<br>    <br>    try:<br>        g()<br>    except Exception as e:<br>        print(e)<br>
登录后复制
登录后复制
登录后复制
登录后复制
子句。 

>如果输入一个整数,则程序可以按预期工作。但是,如果您输入浮子或字符串,则程序将停止执行。

当您捕获异常时,您有三个选项:
Please enter a number: 10.3<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: hello<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: 10.0<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: <br>
登录后复制
登录后复制
登录后复制

  • >
  • 悄悄地吞下它(静静地处理并继续运行)。

>吞咽异常

import json<br>import yaml<br><br>def parse_file(filename):<br>    try:<br>        return json.load(open(filename))<br>    except json.JSONDecodeError<br>        return yaml.load(open(filename))<br>
登录后复制
登录后复制
登录后复制
>如果您知道如何处理并可以完全恢复它,则应吞下异常。如果JSON解析器提出了该文件不是有效的JSON文件的例外,请吞下它并尝试使用YAML解析器。如果YAML解析器也失败了,那么您让异常传播。

>请注意,其他例外(例如未找到或未读取权限的文件)将传播,并且不会被特定条款捕获。在这种情况下,这是一个很好的策略,您只需要在JSON解析因JSON编码问题而失败的情况下尝试YAML解析。>如果要处理except Exception>

所有例外,则只需使用 <code> <code> <code> dececkion excect 。例如:<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">def f():&lt;br&gt; return 4 / 0&lt;br&gt;def g():&lt;br&gt; raise Exception(&quot;Don't call us. We'll call you&quot;)&lt;br&gt;def h():&lt;br&gt; try:&lt;br&gt; f()&lt;br&gt; except Exception as e:&lt;br&gt; print(e)&lt;br&gt; &lt;br&gt; try:&lt;br&gt; g()&lt;br&gt; except Exception as e:&lt;br&gt; print(e)&lt;br&gt;</pre><div class="contentsignin">登录后复制</div></div><div class="contentsignin">登录后复制</div></div><div class="contentsignin">登录后复制</div></div><div class="contentsignin">登录后复制</div></div>><p>请注意,通过添加<code>as e,您可以将异常对象绑定到您的名称e>的name

>。这使您可以执行一些本地处理,但仍然可以让高层处理。在这里,

函数打印了控制台的异常类型,然后再次提高异常。

raise>提出不同的异常invoke_function()

>在某些情况下,您想提出不同的例外。有时,您想将多个不同的低级异常分组为一个类别,该类别由高级代码统一处理。在订单案例中,您需要将异常转换为用户级别,并提供一些特定于应用程序的上下文。
Please enter a number: 10.3<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: hello<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: 10.0<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: <br>
登录后复制
登录后复制
登录后复制

最后句子

有时您想确保执行某些清理代码,即使在此过程中提出了一个例外。例如,您可能有一个数据库连接,一旦完成后就要关闭。这是做错方法的错误方法:

如果

函数提出了异常,则对
import json<br>import yaml<br><br>def parse_file(filename):<br>    try:<br>        return json.load(open(filename))<br>    except json.JSONDecodeError<br>        return yaml.load(open(filename))<br>
登录后复制
登录后复制
登录后复制
>的调用将永远不会执行,并且DB连接将保持打开状态。尝试执行所有异常处理程序后,子句始终执行。这是正确执行操作的方法:

query()close_db_connection()> finally的调用可能不会返回连接或提出异常本身。在这种情况下,无需关闭DB连接。

def print_exception_type(func, *args, **kwargs):<br>    try:<br>        return func(*args, **kwargs)<br>    except Exception as e:<br>        print(type(e))<br>
登录后复制
使用

>,您必须注意不要在那里引起任何例外,因为它们会掩盖原始异常。open_db_connection()>

上下文经理

finally

with

def invoke_function(func, *args, **kwargs):<br>    try:<br>        return func(*args, **kwargs)<br>    except Exception as e:<br>        print(type(e))<br>        raise<br>
登录后复制

上下文管理者在清理代码中包装其他机制,即使在清理代码中均已自动执行。您使用的是process()>语句,而不是尝试封锁。这是一个具有文件的示例:即使with提出了例外,当退出

>块的范围时,即使

提出了例外,无论是否处理过例外,该文件都将立即正确关闭。它在Web应用程序中特别有用,在Web应用程序中,您可以以通用的方式对待所有异常:只需记录异常,然后将错误消息返回给呼叫者。

在记录时,记录异常类型,错误消息和stacktrace是很有用的。所有这些信息都可以通过

>对象获得,但是如果您在异常处理程序中使用

方法,则Python记录系统将为您提取所有相关信息。

>这是我建议的最佳实践:

def f():<br>    return 4 / 0<br>def g():<br>    raise Exception("Don't call us. We'll call you")<br>def h():<br>    try:<br>        f()<br>    except Exception as e:<br>        print(e)<br>    <br>    try:<br>        g()<br>    except Exception as e:<br>        print(e)<br>
登录后复制
登录后复制
登录后复制
登录后复制

>如果您遵循此模式(假设您是否正确设置记录),那么无论发生什么情况,您都会在日志中获得不错的记录,并且可以解决该问题。这是一种浪费,它可能会使您感到困惑,并让您认为同一问题的多个实例发生了多次记录的一个实例。

>

>最简单的方法是让所有例外的方式让所有异常传播(除非可以自信地吞咽和吞咽),然后将其登录到您的应用程序/系统/系统的最高级别。功能。最常见的实现是使用日志文件。但是,对于具有数百,数千或更多服务器的大型分布式系统,这并不总是最好的解决方案。

跟踪整个基础架构中的异常,诸如Sentry之类的服务非常有用。它集中了所有异常报告,除了堆叠式添加每个堆栈框架的状态之外(在提高异常时变量的值)。它还提供了一个非常不错的界面,其中包含仪表板,报告和方法来通过多个项目分解消息的方法。它是开源的,因此您可以运行自己的服务器或订阅托管版本。下面是屏幕截图,是一个屏幕截图,显示Sentry如何显示Python应用程序中的错误。

>

,这是文件的详细堆栈跟踪,导致错误。在问题的第一个迹象的系统中,吓坏了的系统不是很有用。

如果您的代码正在访问某些不响应的远程系统,则传统解决方案是超时,但有时并非每个系统都会按超时设计。随着条件的变化,超时并不总是很容易校准。

另一种方法是快速失败然后重试。好处是,如果目标响应迅速,那么您就不必花费大量时间在睡眠状态,并且可以立即做出反应。但是,如果失败了,您可以多次重试,直到确定它确实无法到达并引起例外。在下一部分中,我将介绍一个可以为您做的装饰器。

>有用的装饰器使用Python处理专业错误

>两个可以帮助解决错误处理的装饰器的是

>,它会使用Python处理专业错误

,它会再次登录例外,然后再提高它,然后将其重新调用,该装饰器将重新调用功能几次。

>错误记录器

这是一个简单的实现。装饰器除了登录对象。当它装饰功能并调用函数时,它将在一个try-except子句中包装呼叫,如果有例外,它将记录下来并最终提高异常。

def f():<br>    return 4 / 0<br>def g():<br>    raise Exception("Don't call us. We'll call you")<br>def h():<br>    try:<br>        f()<br>    except Exception as e:<br>        print(e)<br>    <br>    try:<br>        g()<br>    except Exception as e:<br>        print(e)<br>
登录后复制
登录后复制
登录后复制
登录后复制

Please enter a number: 10.3<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: hello<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: 10.0<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: <br>
登录后复制
登录后复制
登录后复制
这是如何使用它的:

>

import json<br>import yaml<br><br>def parse_file(filename):<br>    try:<br>        return json.load(open(filename))<br>    except json.JSONDecodeError<br>        return yaml.load(open(filename))<br>
登录后复制
登录后复制
登录后复制

retier

retier >结论错误处理对用户和开发人员都至关重要。 Python在语言和标准库中为基于异常的错误处理提供了很好的支持。通过勤奋地遵循最佳实践,您可以征服这一经常被忽视的方面。>已通过Esther Vaati的贡献进行了更新。 Esther是Envato Tuts的软件开发人员和作者。

以上是使用Python处理专业错误的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板