python 期货交易_Python期货量化交易基础教程(8)
8、錯誤和異常處理
Python中常見的錯誤有兩類,一是語法錯誤,二是異常。
語法錯誤是違反了Python語法規則,導致代碼無法執行。
異常是語法沒有錯誤,但在執行過程中因為代碼邏輯問題又發生了故障。
8.1、try語句:
Python中用try語句處理異常。
我們先從示例開始:
>>> if:
File "", line 1
if:
^
SyntaxError: invalid syntax
>>>
此例是一個不完整的if語句,報了語法錯誤:SyntaxError,具體內容為invalid syntax,語法錯誤在編寫代碼時就應當避免。
再看下一個例子:
>>> def func(a):
... print(a+5)
...
>>> a='xyz'
>>> func(a)
Traceback (most recent call last):
File "", line 1, in
File "", line 2, in func
TypeError: can only concatenate str (not "int") to str
>>> func(b)
Traceback (most recent call last):
File "", line 1, in
NameError: name 'b' is not defined
>>>
此例定義一個函數func和一個變量a,然后調用func并把a作為參數傳入,語法沒有錯誤,但a是字符串不能與整型相加,產生了邏輯錯誤,所以拋出了異常類型錯誤:TypeError,具體內容為can only concatenate str(not"int") to str。調用func(b)由于b沒有定義,所以拋出了異常名字錯誤:NameError,具體內容為name 'b'is not defined
我們先用一簡單的try語句捕捉上例異常,因為我們已經知道了異常是類型錯誤和名字錯誤,所以可如下寫:
>>> try :
... func(a)
... func(b)
... except TypeError:
... print('a值不能運算')
... except NameError:
... print('b未定義')
...
a值不能運算
>>>
try后跟可能拋出異常的語句func(a)、func(b),except后跟異常名,表示捕捉指定異常,try按字面意思就是嘗試運行其后的語句,如果發生異常就由后面的except捕捉。此例有兩個異常,所以用兩個except捕捉,指定的異常是TypeError和NameError,捕捉到了異常則執行該異常下的語句塊,輸出結果只有'a值不能運算',說明當捕捉到一個異常后,其余的異常不再捕捉,因為其余可能產生異常的語句沒有再執行的意義。
如果多個異常會用到同樣的處理語句,則多個異??梢苑旁谕粋€except后面,例如:
>>> try :
... func(a)
... func(b)
... except (TypeError,NameError):
... print('a值不能運算或b值未定義')
...
a值不能運算或b值未定義
>>>
表示捕捉異常TypeError或NameError。
我們可以用as語句獲取異常的具體內容,并將內容賦值給變量,如下:
>>> try :
... func(a)
... except TypeError as T:
... print('a值不能運算')
... print(T)
...
a值不能運算
can only concatenate str (not "int") to str
>>>
用as語句把TypeError的具體內容賦值給T,再輸出T,即:can only concatenate str(not"int") to str
如果except后跟Exception,則捕捉所有的常規異常錯誤,例如:
>>> try :
... func(a)
... except Exception as e:
... print('捕捉到了異常:',e)
...
捕捉到了異常: can only concatenate str (not "int") to str
>>>
如果except后不跟異常名,則捕捉所有的異常,包括自定義的異常,例如:
>>> try :
... func(a)
... except :
... print('捕捉到了異常')
...
捕捉到了異常
>>>
但不建議這么做,因為不知道異常的具體內容是什么,難以對異常排查,所以except后至少應跟常規異常Exception,自定義的異常也應該繼承Exception。
我們可用mro()函數查看異常的繼承順序,例如:
>>> TypeError.mro()
[, , , ]
>>>
從繼承的順序可知,異常的太上皇是BaseException,BaseException是所有異常的基類,BaseException一般用不到,常規錯誤基類Exception是皇上,用到Exception就夠了,自定義的異常也應直接或間接繼承Exception。通常對于不確定的異常用Exception捕捉,并放在最后捕捉,如果放前面則異常都被Exception截獲,其后的異常不會再被檢驗。
更全異常捕捉示例:
>>> try :
... func(a)
... func(b)
... except TypeError as T:
... print('a值不能運算')
... print(T)
... except NameError as N:
... print('b值未定義')
... print(N)
... except Exception as e:
... print(e)
...
a值不能運算
can only concatenate str (not "int") to str
>>>
如果執行語句沒有異常,try語句便可以執行結束了,但若需要在沒有異常時也執行某些語句,可以用else語句執行,例如:
>>> a=4;b=6
>>> try :
... func(a)
... func(b)
... except TypeError as T:
... print('a值不能運算')
... print(T)
... except NameError as N:
... print('b值未定義')
... print(N)
... except Exception as e:
... print(e)
... else:
... print('沒有異常')
...
9
11
沒有異常
>>>
重新定義了a、b兩個整數,則調用func(a)、func(b)便可正常執行,沒有捕捉到異常則執行else語句。
最后,如果不管是否有異常,都要執行某些操作,比如釋放資源,則用finally語句來執行,例如:
>>> try :
... func(a)
... func(b)
... except TypeError as T:
... print('a值不能運算')
... print(T)
... except NameError as N:
... print('b值未定義')
... print(N)
... except Exception as e:
... print(e)
... else:
... print('沒有異常')
... finally:
... print('刪除變量釋放資源')
... del a,b
...
9
11
沒有異常
刪除變量釋放資源
>>> a
Traceback (most recent call last):
File "", line 1, in
NameError: name 'a' is not defined
>>> b
Traceback (most recent call last):
File "", line 1, in
NameError: name 'b' is not defined
>>>
finally語句里刪除了變量a、b,所以再調用a、b時報了NameError。以上便是try異常處理語句的基本結構。
8.2、raise語句:
我們除了讓程序運行時自動拋出異常外,還可以按需要主動拋出異常,Python中用raise語句拋出指定的異常,并可向異常傳遞數據。
我們先看一個示例:
def func(a):
if type(a) != int:
raise ValueError
print(a+5)
函數中用if語句判斷參數a,不是整型時拋出ValueError異常,執行效果如下:
>>> a='xyz'
>>> func(a)
Traceback (most recent call last):
File "", line 1, in
File "", line 3, in func
ValueError
>>> try:
... func(a)
... except ValueError as e:
... print(e,'不是整型')
...
不是整型
前面我們把字符串傳入func由程序拋出異常時拋出的是TypeError,這次我們用raise主動拋出異常,則拋出了指定異常ValueError 。
ValueError并沒有具體信息,所以print語句沒有輸出e的值,我們可以用raise拋出異常的同時傳入數據,例如:
>>> def func(a):
... if type(a) != int:
... raise ValueError('不是整型')
... print(a+5)
...
>>> a='xyz'
>>> try:
... func(a)
... except ValueError as e:
... print(e)
...
不是整型
>>>
這次拋出的ValueError異常輸出了具體信息“不是整型”。
8.3、自定義異常類:
我們可自己定義異常類,自定義異常應繼承常規異常類Exception,例如:
class ZiError(Exception):
def __init__(self, arg):
self.arg = arg
def __str__(self):
return self.arg
自定義異常需要用raise語句主動拋出,且會自動調用__str__()函數返回異常具體信息,例如:
>>> def func(a):
... if type(a) != int:
... raise ZiError('不是整型') #拋出ZiError的實例,arg值為'不是整型'
... print(a+5)
...
>>> a='xyz';b=5
>>> try:
... func(b)
... func(a)
... except ZiError as z:
... print(z)
...
10
不是整型
>>>
func(b)可正常執行,但func(a)拋出自定義異常ZiError,并輸出異常信息:不是整型。
總結
以上是生活随笔為你收集整理的python 期货交易_Python期货量化交易基础教程(8)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python locale模块_使用py
- 下一篇: java显式构造函数_C++中的显式构造