1. 程式人生 > >【python學習-6】異常處理

【python學習-6】異常處理

value cat 寫博客 目的 種類 n) 這樣的 自己 true

最近在網上看到了一種學習方法名叫費曼學習法,說的是學習一個東西的時候,要嘗試著給別人講出來,就是一種備課式的學習。

第一步,選擇一個你想要理解的概念, 然後拿出一張白紙, 把這個概念寫在白紙的最上邊。
第二步,設想一種場景,你正要向別人傳授這個概念在白紙上寫下你對這個概念的解釋, 就好像你正在教導一位新接觸這個概念的學生一樣。當你這樣做的時候, 你會更清楚地意識到關於這個概念你理解了多少, 以及是否還存在理解不清的地方。
第三步,如果你感覺卡殼了, 就回顧一下學習資料,無論何時你感覺不清楚了, 都要回到原始的學習資料並重新學習讓你感到不清楚的那部分,直到你領會得足夠順暢, 順暢到可以在紙上解釋這個部分為止。
第四步,為了讓你的講解通俗易懂,簡化語言表達最終的目的, 是用你自己的語言, 而不是學習資料、課程中的語言來解釋概念。如果你的解釋很冗長或者令人迷惑, 那就說明你對概念的理解可能並沒有你自己想象得那麽順暢,你要努力簡化語言表達, 或者與已有的知識建立一種類比關系, 以便更好地理解它。

我覺得費曼學習法很不錯,可以運用到日常的學習中。從這個意義上來說,寫博客就顯得是一件很明智的事情了,因為你就是把你所理解的東西再講出來。

閑話就到這裏,開始今天的學習吧。

1、異常的處理:

  python的異常處理和 java 相似性很高,下面是常有的異常處理代碼格式:

try:
    <語句>
except <異常1>:
    <語句>
except <異常2>:
    <語句>
else:
    <語句>
try:
    <語句>
finally:
    <語句>

  對於catch語句,有多種寫法:

except:                                      #捕獲所有異常
except <異常名>:                             #捕獲單個異常
except (異常名1,異常名2):                     #捕獲多個異常
except <異常名> as <數據>:                    #捕獲指定異常及附加信息
except (異常名1,異常名2) as <數據>:            #捕獲多個異常及附加信息

  代碼示例如下: 

#!/usr/bin/python

l = [1,2,3,4,5]; print(---start---); try: print(l[6]); except: # except 為 try的代碼 發生異常時執行。except 是一個總類,所有異常都可以捕獲 print(error); else: # else 為 try的代碼 沒有引發異常時執行 print(no error); finally: # finally 為不管 try的代碼 是否異常都執行 print(finally code); print(---end---); # 其他語句
#!/usr/bin/python
l = [1,2,3,4,5];
print(---start---);
try: 
    print(l[6]);
finally: # finally 為不管 try的代碼 是否異常都執行
    print(finally code); # 發生異常,但是此語句是執行了的
print(---end---); # 其他語句,沒有執行
#!/usr/bin/python
# 不同類型的異常區分處理
l = [1,2,3,4,5];
print(---start---);
try: 
    print(l[6]);
except ZeroDivisionError: 
    print(ZeroDivisionError);
except IndexError as data:
    print(IndexError:);
    print(data); # 打印異常信息
else: # else 為 try的代碼 沒有引發異常時執行
    print(no error);
finally: # finally 為不管 try的代碼 是否異常都執行
    print(finally code);
print(---end---); # 其他語句

  上面的第二個代碼,看到了兩個異常 ZeroDivisionError 和 IndexError ,那麽常見的異常有哪些呢?

AttributeError            調用不存在的方法引發的異常
EOFError                遇到文件末尾引發的異常
ImportError                導入模板出錯引起的異常
IndexError                列表越界異常
IOError                 I/O操作引起的異常
KeyError                使用字典中不存在的變量名應發的異常
NameError                使用不存在的變量名引發的異常
TabError                語句縮進不正確異常
ValueError                搜索列表中不存在的值引發異常
ZeroDivisionError        除數為0引發的異常

  在python中,如果多種異常的處理是一樣的,那麽可以把兩個異常寫在一塊兒:

#!/usr/bin/python
# 不同類型的異常區分處理
l = [1,2,3,4,5];
print(---start---);
try: 
    print(l[6]);
except ZeroDivisionError: 
    print(ZeroDivisionError);
except (IndexError,TabError): # 兩個異常同樣的處理
    print(IndexError or TabError);
else: # else 為 try的代碼 沒有引發異常時執行
    print(no error);
finally: # finally 為不管 try的代碼 是否異常都執行
    print(finally code);
print(---end---); # 其他語句

2、用代碼拋出異常

  上面所說的是Python內置異常,在腳本中,還可以使用 raise 語句手動引發異常。在類中也可以使用 raise 引發異常,並向異常傳遞數據。

raise 異常名
raise 異常名,附加數據
raise 類名

  簡單使用一下raise:

#!/usr/bin/python
print(---start---);
try: 
    raise Exception
except Exception: 
    print(Exception);
else: 
    print(no error);
print(---end---); # 其他語句

  實際應用中應該是這樣的:

#!/usr/bin/python
def add(x,y):    
    if x == 0 or y == 0:
        raise ZeroDivisionError(x or y is 0);
    return x+y;

try:
    print(run 1);
    a = add(1,2);
    print(a);
    print(run 2);
    b = add(1,0);
    print(b);  # 這裏沒有打印,因為上一行異常了
except ZeroDivisionError as data:
    print(data);

  assert語句的使用:assert語句同樣可以引發異常,但與raise不同,assert語句在條件測試為假時,才引發異常。

assert <條件測試>,<異常附加信息>

  assert的例子:

#!/usr/bin/python
import
traceback def add(x,y): assert x != 0 and y != 0 , x or y is 0; return x+y; try: print(run 1); a = add(1,2); print(a); print(run 2); b = add(1,0); print(b); except: # traceback.print_exc() # 使用python中的traceback模塊,跟蹤錯誤 f=open("D:/tmp/pyError.log",a+) traceback.print_exc(file=f) # 將報錯輸入到文件中 f.flush()

  assert 相當於 raise 語句 和 if 語句聯合使用,但是assert語句一般用於開發自測。只有__debug__為true是,assert 才有效。

3、自定義異常類

  python中可以通過繼承Exception類來創建自己的異常類:  

#!/usr/bin/python

class MyError(Exception):
    def __init__(self,data):
        self.data = data;
    def __str__(self):
        return "MyError:"+self.data;

try:
    raise MyError(0.0);
except Exception as e:
    print(e);

【python學習-6】異常處理