首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板