目錄
>
函數打印了控制台的異常類型,然後再次提高異常。
提出了例外,無論是否處理過例外,該文件都將立即正確關閉。它在Web應用程序中特別有用,在Web應用程序中,您可以以通用的方式對待所有異常:只需記錄異常,然後將錯誤消息返回給呼叫者。
>錯誤記錄器
首頁 後端開發 Python教學 使用Python處理專業錯誤

使用Python處理專業錯誤

Mar 04, 2025 am 10:58 AM

在本教程中,您將從整個系統的角度學習如何處理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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
Python vs.C:申請和用例 Python vs.C:申請和用例 Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時的Python計劃:一種現實的方法 2小時的Python計劃:一種現實的方法 Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python:遊戲,Guis等 Python:遊戲,Guis等 Apr 13, 2025 am 12:14 AM

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python與C:學習曲線和易用性 Python與C:學習曲線和易用性 Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

Python和時間:充分利用您的學習時間 Python和時間:充分利用您的學習時間 Apr 14, 2025 am 12:02 AM

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python vs.C:探索性能和效率 Python vs.C:探索性能和效率 Apr 18, 2025 am 12:20 AM

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。

Python:自動化,腳本和任務管理 Python:自動化,腳本和任務管理 Apr 16, 2025 am 12:14 AM

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

Python標準庫的哪一部分是:列表或數組? Python標準庫的哪一部分是:列表或數組? Apr 27, 2025 am 12:03 AM

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

See all articles