python进阶八_警告和异常
心情有點糾結,怎么說呢,倒不是因為其他學習上的事情,反而是因為生活上狗血的劇情逼著人偏離,漸行漸遠,人跟人之間有誤會也是正常的,可能是因為交流不夠,彼此不夠了解吧,希望能盡快度過這一段糾結的日子,簡單的生活,慢慢的品味,細細的思考。
最近一段時間,因為需要,借閱了一本Python?Cookbook,發現這本書在很多方面介紹的都很不錯,比如一些系統管理,web,分布式編程,數據持久化等等這些方面。但是卻沒有發現詳細的關于錯誤和異常的一些介紹,本著作死的態度打算好好研究一下。
首先,照例,我們先來看一段示例程序:
首先,我們這里出現的不是異常,而是另一個我們經常遇到的非致命警告warning,主要是向用戶提供非致命警告,指出運行一個程序時遇到的問題,通常來說,我們最好是在程序中不要出現這些東西,否則我們就需要從新審視我們的代碼了。
一.Warning---非致命警告
警告使用的是內置異常類Warning的子類進行分類,通常需要根據過濾器(filter)設置來處理。過濾器一般包括,Action,Message,Category,Module和Line?number.也可以這么理解,這里面的消息Message部分通常是一個匹配警告文本的正則表達式,類別Catregory是一個異常類的名稱,模塊Module包含一個正則表達式,要與生成警告的模塊名匹配,行號Line?Number可以改變在一個警告出現時的處理
每當生成一個警告時,都需要將其與注冊過的過濾器比較,第一個匹配的過濾器將控制這個警告采取的動作,否則采取默認的動作,其實本質流程上會發現與Exception異常處理如出一轍,看一下常見的過濾器動作:
動作 | 含義 |
error | 將警告提升為異常 |
ignore | 忽略警告 |
always | 總是拋出警告 |
default | 從各個位置第一次生成警告時輸出警告 |
module | 從各個模塊第一次生成警告時輸出警告 |
once | 第一次生成警告時輸出警告 |
1.模式過濾
簡單的過濾如示例中的show_warning_by_filtering(),但是想要通過編程按照更復雜的規則進行過濾就需要使用filterwarning(),比如,需要根據消息文本的內容過濾,可以提供一個正則表達式作為參事。如示例中的show_pattern_filter(),模式包含‘do?not’具體的消息中使用了‘Do?not’,正則表達式被編譯為不區分大小寫的匹配,故這個模式會匹配。當然,同樣的匹配也適用于源模塊名,可以將模塊名作為模式傳至module參數,抑制來自copy模塊的所有消息,如下所示:
當然,我們也可以限定只抑制某一行上的警告,如下所示:
2.重復警告
默認情況,大多數警告只會在給定位置第一次出現時才會輸出,但是假如我們的程序里面出現了警告,我們改完之后發現后面還有一個相同的警告,這個時候就會有不知道什么時候是個頭的錯覺,最直接的辦法就是在每一個出現警告的地方我們就給他來一個警告,最起碼我們能做到心里有數,如下所示:
3.警告定向輸出
一般情況下,警告都會輸出到sys.stderr,我們可以通過替換warning模塊中的showwarning()函數來改變這個行為,如下所示:
稍微注意下:這里的UserWarning是一種警告類型,來自用戶代碼的警告的基類,還有一些其他的類型,比如:
Warning-----所有警告的基類
DeprecationWarning----用于不再維護的特性
PendingDeprecationWarning----用于很快會廢棄的特性
SyntaxWarning---用于有問題的語法
RuntimeWarning----用于運行時可能導致問題的事件
FutureWarning----關于將來語言或者庫中可能的改變的有關警告
ImportWarning??關于導入模塊時出現的問題的警告
UnicodeWarning---關于Unicode文本中的問題的警告
二.Exception----內置異常類
1.異常基類
BaseException:
所有異常的基類,實現了基類的邏輯,可以使用str()由傳入構造函數的參數創建異常的一個串表示
Exception:
有些異常不會導致退出正在運行的應用,Exception是這些所有異常的基類,用戶定義的所有異常應當都是用其作為基類
StandardError:
標準庫中使用的內置異常的基類
ArithmeticError:
與數學相關的錯誤的基類
LookupError:
無法找到某個對象時產生的錯誤的基類
EnvironmentError:
來自Python外部(操作系統,文件系統等)錯誤的基類
2.常見的異常
這里,我們僅僅以AssertionError為例,AssertionError是由一個失敗的assert語句產生,斷言在庫中一般很常見,通常用來對傳入參數的限制,通過類似failif()等方法,AssertionError還可以用在unittest模塊創建的自動測試中,運行的自動測試套件的程序會監視AssertionError異常,作為測試失敗的一個特殊提示,如下所示:
當然除此之外還有很多異常,如下:
AttributeError:當一個屬性引用或賦值失敗時,會產生
EOFError:對于類似input或者raw_input這樣的內置函數,如果在遇到輸入流末尾之前沒有讀到任何數據,會產生
FloatingPointError:這個錯誤由導致錯誤的浮點操作產生,前提是已經打開了浮點異常控制(fpectl),啟用fpectl時,要求編譯解釋器提供?with-fpectl標志,但是標準文檔中不提倡使用fpectl
IOError:輸入或輸出失敗時會產生,如磁盤滿了,輸入文件不存在等等
ImportError:無法導入一個模塊或者模塊中的一個成員時會產生該異常
IndexError:如果一個序列引用越界,就會產生IndexError
KeyError:如果沒有找到一個值作為字典的鍵,會產生異常
KeyBoardInterrupt:用戶按下Ctrl-C(或者Delete)終止一個正在運行的程序時,會產生
MemoryError:如果一個程序用盡了所有內存,而且可以恢復,會產生
NameError:如果代碼引用了一個名字,而當前作用域中不存在這個名字,會產生
NotImplementedError:用戶自定義的基類可能產生NotImplementedError,來指示一個方法或者行為需要子類定義
OSError:一個操作系統級別函數返回錯誤時會產生OSError
OverflowError:當一個算術運算超出變量類型的界限時,會產生
RefernceError:
使用一個weakref代理訪問已經被垃圾回收的對象時,會產生
RuntimeError:如果沒有其他更特定的異常可用,就要使用RuntimeError異常
SyntaxError:當解釋器無法解釋程序的時候,會產生
SystemError:如果錯誤發生在解釋其本身,會產生
SystemExit:當調用sys.exit()會產生
TypeError:結合對象或者在對象上調用函數時,如果對象類型不正確會產生
UnboundLocalError:一種NameError,特別針對局部變量名
UnicodeError:ValueError的一個子類,出現Unicode問題時產生
ValueError:如果一個函數接收到的值類型正確,但是值不合法
ZeroDivisionError:0做分母時拋出
?
特別提醒:關于為什么要了解異常呢,首先在程序中我們可能會經常碰到,但是最重要的是這對以后我們編寫程序,調試程序提供了有力的幫助,針對錯誤信息,可以立即判斷出什么地方出了問題,這才是最重要的地方
轉載于:https://www.cnblogs.com/ainima/p/6331117.html
總結
以上是生活随笔為你收集整理的python进阶八_警告和异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一道数组求连续子集最大值的题目。
- 下一篇: 黑马程序员——Java集合基础知识之Ma