日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 期货交易_Python期货量化交易基础教程(8)

發布時間:2025/3/21 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。