Python基礎-14異常處理

来源:https://www.cnblogs.com/surpassme/archive/2020/05/31/13020566.html
-Advertisement-
Play Games

14.異常處理 只要是人編寫的代碼,或多或少都會存在一些Bug,當這些Bug被程式捕捉之後,需要怎麼處理,就需要我們告訴代碼應該處理,通常稱之為異常處理。 14.1 什麼是異常 Python使用異常對象來表示異常狀態,併在遇到錯誤進引發異常,異常對象被捕捉到未處理,程式則會終止並顯示相應的錯誤信息, ...


14.異常處理

    只要是人編寫的代碼,或多或少都會存在一些Bug,當這些Bug被程式捕捉之後,需要怎麼處理,就需要我們告訴代碼應該處理,通常稱之為異常處理。

14.1 什麼是異常

    Python使用異常對象來表示異常狀態,併在遇到錯誤進引發異常,異常對象被捕捉到未處理,程式則會終止並顯示相應的錯誤信息,經典的異常信息如下所示:

>>> 1/0
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ZeroDivisionError: division by zero

    以上的信息明確告訴我們,除數為0導致產生異常,但如果只是顯示錯誤信息,沒有太大意義。針對這種需要在代碼中進行捕捉並提供處理方案。

14.2 自定義異常

    可能在代碼中,某些代碼並不會觸發異常,但卻不符合業務邏輯,需要人為的拋出異常,這時就需要自定義異常了。

14.2.1 raise語句

    使用raise可以引發異常,並將一個類(必須是Exception的子類)或實例做為參數。如果將類做作為參數,將自動創建實例。如下所示:

>>> raise Exception
Traceback (most recent call last):
  File "<input>", line 1, in <module>
Exception

>>> raise Exception("i am Exception")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
Exception: i am Exception

    示例一為通用異常,無法得知具體的異常信息,示例二,自定義了異常的詳細信息,這種方便用戶定位問題。常見的內置異常類如下所示:

140201Python內置異常類.png

14.2.2 自定義異常類

    雖然內置的異常非常多,能滿足大多數的需求,但也有不能滿足的情況下,這時就可以自定義異常類,並添加種類異常類中的方法。通過語法格式如下所示:

class MyException(Exception):
    
    pass

14.3 捕捉異常

    將代碼中可能存在異常的錯誤給抓取到並顯示出來稱為捕捉異常。針對這種情況,Python提供了try...except...else語句。其基本語法格式如下所示:

try:
   pass
except ErrorType:
   pass
else:
   pass
finally:
   pass

以上的為最全的一種格式,日常應用else和finally可省略。

14.3.1 try...except:

    這種形式是日常形式使用最多的一種情況,示例代碼如下所示:

def div(x,y):
    try:
        return x/y
    except ZeroDivisionError:
        raise Exception("除數為0")

14.3.2 多個except語句

    當某一段代碼可能存在多種異常時,可以使用多個except語句,示例代碼如下所示:

def div(x,y):
    try:
        x=int(x)
        y=int(y)
        return x/y
    except ZeroDivisionError:
        print("除數為0")
    except TypeError:
        print("傳入的參數不是數字")

    如果代碼有很多異常需要處理,需要寫很多個except語句,Python也支持一個except語句捕捉多種異常,可放在元組中實現,如下所示:

def div(x,y):
    try:
        x=int(x)
        y=int(y)
        return x/y
    except (ZeroDivisionError,TypeError,OSError):
        print("程式開小差啦。。。。")

14.3.3 捕捉對象

    要在except子句中訪問異常對象本身,雖然可以使用元組傳遞參數,但參數也只有一個。而如果需要將其對應的詳細錯誤信息列印出來可以使用以下這種形式:

def div(x,y):
    try:
        x=int(x)
        y=int(y)
        return x/y
    except (ZeroDivisionError,TypeError,OSError) as ex:
        print(f"程式開小差啦。。。。\n{ex}")

    上述代碼中,except可以捕捉3種異常,但因同時顯式捕捉了對象本身,因此可以將其詳細錯誤列印出來,方便代碼調試和維護。

14.4.4 try...except...else

    在某些情況下,在沒出現異常時,希望繼續下一個代碼塊。則可以像for...else一樣,使用try...except...else。示例代碼如下所示:

def sub(x,y):
    try:
        x=int(x)
        y=int(y)
    except Exception as ex:
        print(f"捕捉到異常\n{ex}")
    else:
        return x-y

    以上代碼,當x,y被轉換為整型數據沒有出現異常時,則運行else中的代碼塊。

14.4.5 try...finally

    無語是否發生異常,在程式結束前,均執行finally中的語句。示例代碼如下所示:

def sub(x,y):
    try:
        x=int(x)
        y=int(y)
    except Exception as ex:
        print(f"捕捉到異常\n{ex}")
    else:
        print(f"程式運行結果為:{x-y}")
    finally:
        print("無論程式是否有異常,都需要運行我")

    Python中的異常處理並不太很難,在平時的實踐過程,應該在可能出現異常的代碼添加異常處理,方便調試、排錯和代碼定位。

本文地址:https://www.cnblogs.com/surpassme/p/13020566.html
本文同步在微信訂閱號上發佈,如各位小伙伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下麵的二維碼添加關註:
MyQRCode.jpg


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 遍歷Map的方式 第一種通過 map1.keySet() 獲取key 通過key 找到value; 第二種通過Map.Entry(String,Integer) 獲取,然後使用entry.getKey()獲取到鍵,通過entry.getValue()獲取到值;第三種只遍歷鍵或者值,通過加強for迴圈 ...
  • 前言 隨著現在直播的興起,主播這個職業逐漸走入人們的視野。現在各大平臺都有當家花旦、一哥、一姐等稱號。其實人氣是一方面,但是顏值才是硬實力。 接下來帶大家進行主播的顏值檢測評分,看看誰是最靚的崽(*^▽^*) 本篇大致內容: 1、爬取主播的直播人臉圖 2、調用百度人臉檢測開放介面,進行顏值打分 環境 ...
  • switch後面使用的表達式可以是哪些數據類型?如何從控制台獲取String和int型的變數,並輸出?經典運算題:十進位轉為十六進位。 ...
  • Redis(Remote Dictionary Server),即遠程字典服務,是一個開源的使用ANSI C語言編寫、高性能的key-value資料庫,是當前使用最廣泛的NoSQL之一。 1、簡介 Redis是一個開源(BSD許可)的,記憶體中的數據結構存儲系統,它可以用作資料庫、緩存和消息中間件。 ...
  • //include包含,包含stdio.h頭文件,方便調用printf函數#include <stdio.h> //主函數,代表了整個程式的生命周期//1、它是整個程式的入口//2、有且只能有一個int main(){ printf("***********************\n"); pri ...
  • 基於laravel製作API介面 關於APIAPI(Application Programming Interface,應用程式編程介面)是一些預先定義的函數,目的是提供應用程式與開發人員基於某軟體或硬體得以訪問一組常式的能力,而又無需訪問源碼,或理解內部工作機制的細節。需要註意的是:API有它的具 ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:費弗里 1. 簡介 Kepler.gl相信很多人都聽說過,作為Uber幾年前開源的互動式地理信息可視化工具,kepler.gl依托WebGL強大的圖形渲染能力,可以在瀏 ...
  • 15.模塊-包-庫 15.1 基本概念 隨著代碼量的不斷增多,一個文件里代碼會越來越長,也不容易維護。為瞭解決這種問題,我們會進行拆分,並將具備類似的功能放同一文件中。這樣每個文件包含的代碼就相對較少。在Python中一個.py文件就稱之為一個模塊,英文叫(module) 使用模塊的好處如下所示: ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...