[python拾遺]異常處理

来源:http://www.cnblogs.com/loveclear/archive/2016/10/01/5925549.html
-Advertisement-
Play Games

異常 異常(Exception)是因為程式的例外、違例、出錯等情況而在正常控制流以外採取的行為,一般分為如下兩個階段: 1.異常發生:一個錯誤發生後被列印出來,稱為未處理異常,而預設的處理則是自動輸出一些調試信息並終止程式運行。 2.異常處理:通過代碼明確地處理異常,則程式不會終止運行,並增強程式的... ...


異常

異常(Exception)是因為程式的例外、違例、出錯等情況而在正常控制流以外採取的行為,一般分為如下兩個階段:

1.異常發生:一個錯誤發生後被列印出來,稱為未處理異常,而預設的處理則是自動輸出一些調試信息並終止程式運行。

2.異常處理:通過代碼明確地處理異常,則程式不會終止運行,並增強程式的容錯性。

說白了,異常處理的目的就是為了是程式的可執行性更高,能順利的運行下去;同時不讓用戶看到難堪的錯誤信息,通俗來說就是不讓用戶看見大黃頁。

可以通過python3中的異常類型(Exception)查看異常。

常見的異常:

AttributeError  #試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x
IOError  #輸入/輸出異常;基本上是無法打開文件
ImportError  #無法引入模塊或包;基本上是路徑問題或名稱錯誤
IndentationError  #語法錯誤(的子類) ;代碼沒有正確對齊
IndexError  #下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
KeyError  #試圖訪問字典里不存在的鍵
KeyboardInterrupt  #Ctrl+C被按下
NameError  #使用一個還未被賦予對象的變數
SyntaxError  #Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)
TypeError  #傳入對象類型與要求的不符合
UnboundLocalError  #試圖訪問一個還未被設置的局部變數,基本上是由於另有一個同名的全局變數,導致你以為正在訪問它
ValueError #傳入一個調用者不期望的值,即使值的類型是正確的

更多的異常:

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

異常處理

python3中提供try語句處理異常,格式為:

try:
    print('#先運行別指定的代碼')
except Exception as e:  #所有的異常都繼承至Exception類,可以捕獲任意異常
    print(e)  #可以獲取異常e
    print('#如果發生了異常,執行異常處理')
else:
    print('#如果主代碼塊沒有異常發生並執行完後,則繼續往下執行')

或者:

try:
    print('#先運行特定的代碼')
except Exception as e:
    print('#捕獲對應的異常並處理之')
finally:
    print('#不管異常與否,最終都會執行')

當然try語句也可以捕獲特定的異常,而非指定異常則無法處理。具體可以看下麵幾個例子:

dic = ["English", 'Chinese']
try:
    dic[10]
except IndexError as e:
    print(e)
s1 = 'hello'
try:
    int(s1)
except ValueError as e:
    print(e)

而當遇到非指定異常,則會報錯

# 未捕獲到異常,程式直接報錯

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)

當要處理多個異常時也可以這樣寫

except ( AttributeError,NameError ) as e:
    print(e)
    print('#這是捕獲多個類型異常的語法')

雖然Exception可以捕獲任意異常,但對於特殊處理或提醒的異常需要先定義,最後定義Exception來確保程式正常運行。所以下麵這種寫法也很常用:

s1 = 'hello'
try:
    int(s1)
except KeyError as e:
    print('鍵錯誤')
except IndexError as e:
    print('索引錯誤')
except Exception as e:
    print('錯誤')

raise語句主動觸發異常,python3中可以利用raise語句拋出一個通用異常類型(Exception),具體如下:

try:
    raise Exception('錯誤了...') #這是主動引發一個異常
except Exception as e:
    print(e)

python3中也可以通過創建繼承至通用異常類型(Exception)的類,來自定義異常:

#關於raise語句,還有:
class Myerror(Exception):
    def __init__(self,msg):
        self.msg = msg

    def __str__(self):  # 以字元串格式輸出
        return self.msg


try:
    raise Myerror('錯誤')
except Exception as f:
    print(f)

異常處理中還可以使用with語句來簡化代碼,常用於文件處理之中,具體示例見[python拾遺]文件操作


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

-Advertisement-
Play Games
更多相關文章
  • 前幾天,因為工作原因,連到了公司的一個java系統。查看數據的時候,突然整個人都不好了,資料庫中日期欄位時間為毛都是整型?之前從來沒有接觸過java,所心就趁機瞭解了一下。原來,在資料庫中,保存的是java中的System.currentTimeMillis()。這個返回是從1970年1月1日0時0 ...
  • 最近在網站首頁上想將Banner壁紙給做到後臺上傳隨時更改的效果。遇到問題便是:將上傳的圖片路徑動態添加到首頁css代碼中,結果嘗試了網上提供的思路,更改相對路徑,沒能成功。於是自己想過另一種實現方案 ...
  • 才學完幾個簡單的標簽 就突發奇想想做一個關於自己的網頁 再加上自己喜歡的人 然後就這麼做了 努力敲起了代碼 大概十幾分鐘的時間 一個簡單的網頁做起了 其實很low 但是還是很興奮的發給了自己的朋友 他們都說厲害了 這麼快就會做網頁了 我問我旁邊的人 她說很一般 突然就有點小失落 學得不怎麼樣 就知道 ...
  • 規則,相同則為假,不同則為真 1 ^ 1 = 0 1 ^ 0 = 1 以下為測試腳本。例子1是判斷一個數組所有的元素是否一致,例子2是異或做簡單加密的方法。 ...
  • 下邊講述Hibernate多對多關係映射。 多對多關係的表的結構為: 兩個實體表,還包含一個關係表,關係表為複合主鍵,如果要使用Hibernate多對多關係映射,則關係表必須只包含兩個欄位,如果生成了Hibernate多對多關係映射,則中間關係表不會生成實體(即沒有對應的pojo類,更沒有其映射文件 ...
  • 1、使用while迴圈輸出 1 2 3 4 5 6 8 9 10 #/usr/bin/env python# -*- coding: utf-8 -*-s = 1while s < 11: if s != 7: print(s) s += 1 2、求1-100的所有數的和 #/usr/bin/env ...
  • 1. Comparator 和 Comparable 相同的地方他們都是java的一個介面, 並且是用來對自定義的class比較大小的,什麼是自定義class: 如 public class Person{ String name; int age }.當我們有這麼一個personList,裡面包含 ...
  • 物理地址 堆的物理地址分配對對象是不連續的。因此性能慢些。在GC的時候也要考慮到不連續的分配,所以有各種演算法。比如,標記 消除,複製,標記 壓縮,分代(即新生代使用複製演算法,老年代使用標記——壓縮) 棧使用的是數據結構中的棧,先進後出的原則,物理地址分配是連續的。所以性能快。 記憶體分別 堆因為是不連 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...