在本教程中,您将从整个系统的角度学习如何处理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解析。>如果要处理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():<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></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>
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
提出了例外,当退出
在记录时,记录异常类型,错误消息和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应用程序中的错误。
>,这是文件的详细堆栈跟踪,导致错误。在问题的第一个迹象的系统中,吓坏了的系统不是很有用。
>两个可以帮助解决错误处理的装饰器的是
>,它会,它会再次登录例外,然后再提高它,然后将其重新调用,该装饰器将重新调用功能几次。
这是一个简单的实现。装饰器除了登录对象。当它装饰功能并调用函数时,它将在一个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 >结论错误处理对用户和开发人员都至关重要。 Python在语言和标准库中为基于异常的错误处理提供了很好的支持。通过勤奋地遵循最佳实践,您可以征服这一经常被忽视的方面。>已通过Esther Vaati的贡献进行了更新。 Esther是Envato Tuts的软件开发人员和作者。
以上是使用Python处理专业错误的详细内容。更多信息请关注PHP中文网其他相关文章!