#try: except: else: #為什麼叫容錯呢,先說說錯誤,這裡說的錯誤並不是因為馬虎或者什麼原因在腳本中留下的bug,這個不能容掉,所謂容掉就是略過這個錯誤,要在測試時候發現並修正,需要容錯的錯誤是在腳本執行之前無法判斷是不是會出錯的錯誤,例如:在寫爬蟲的時候,會爬到很多頁面,這些頁面我 ...
#try: except: else:
#為什麼叫容錯呢,先說說錯誤,這裡說的錯誤並不是因為馬虎或者什麼原因在腳本中留下的bug,這個不能容掉,所謂容掉就是略過這個錯誤,要在測試時候發現並修正,需要容錯的錯誤是在腳本執行之前無法判斷是不是會出錯的錯誤,例如:在寫爬蟲的時候,會爬到很多頁面,這些頁面我也不知道能不能打開,有可能超時,這時候總不能因為這個錯誤把進程停了找問題把,那麼如果有幾萬個地址,估計得用幾年時間去爬。所以這裡就用到了容錯,把這個錯誤跳過去,並把錯誤寫入一個日誌,等全部完成後,再來查看日誌,看哪些頁面報錯誤,然後單獨對這一批頁面進行處理
#以打開文件為例
#先創建10個文件 for i in range(10): file_name = 'a_%d.txt' %i new_file = open(file_name,'w') new_file.close() #然後讀取11個文件,註意,是11個文件,就是說有一個文件是一定不存在的,那麼會報錯,現在我要把這個錯誤跳過,並寫入日誌 #寫日誌函數一會單寫一個,名字就叫write_log for i in range(11): file_name = 'a_%d.txt' %i #open_file = open(file_name,'r') 當讀到第11個文件,就是10的時候會報錯,所以不能這樣 try: open_file = open(file_name,'r') #try後面就是有可能出錯的代碼 except: write_log('open file fail!') #這個是錯誤的處理,就是出錯的話,會把open file fail!寫入日誌,這樣是可以的,但是不建議這樣,最好把這個報錯輸出,並且一起寫到日誌里,就是下麵這樣 #正常寫法 for i in range(11): file_name = 'a_%d.txt' %i try: open_file = open(file_name,'r') except IOError, e: #這個IOError是IO錯誤,就是如果是這個錯誤的話,就把報錯內容寫到e變數里,也可以把IOError換成Exception,這樣無論出什麼錯誤,都會寫到e變數里,不過為了明確錯誤,還是指定錯誤類型比較好 write_log('%s open file fail! %s') %(file_name,e) #將錯誤的文件名和報錯內容全部寫入日誌 else: open_file.close() #雖然已經容錯,不過已經打開的文件還是要關閉的,但是沒有打開,也就是10,無法關閉,所以要加到else裡面,else的功能就是正常執行了,就執行else後面的命令 #open_file.close() 這個是把關閉寫在外面,想想無論正確與否都要關閉,那麼打開10的時候open就報錯了,也就是根本沒打開,那何來的關閉呢
忘了一個加入一堆報錯了,這個是抄來的,百度有很多,可以參考下
異常名稱 | 描述 |
---|---|
BaseException | 所有異常的基類 |
SystemExit | 解釋器請求退出 |
KeyboardInterrupt | 用戶中斷執行(通常是輸入^C) |
Exception | 常規錯誤的基類 |
StopIteration | 迭代器沒有更多的值 |
GeneratorExit | 生成器(generator)發生異常來通知退出 |
StandardError | 所有的內建標準異常的基類 |
ArithmeticError | 所有數值計算錯誤的基類 |
FloatingPointError | 浮點計算錯誤 |
OverflowError | 數值運算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有數據類型) |
AssertionError | 斷言語句失敗 |
AttributeError | 對象沒有這個屬性 |
EOFError | 沒有內建輸入,到達EOF 標記 |
EnvironmentError | 操作系統錯誤的基類 |
IOError | 輸入/輸出操作失敗 |
OSError | 操作系統錯誤 |
WindowsError | 系統調用失敗 |
ImportError | 導入模塊/對象失敗 |
LookupError | 無效數據查詢的基類 |
IndexError | 序列中沒有此索引(index) |
KeyError | 映射中沒有這個鍵 |
MemoryError | 記憶體溢出錯誤(對於Python 解釋器不是致命的) |
NameError | 未聲明/初始化對象 (沒有屬性) |
UnboundLocalError | 訪問未初始化的本地變數 |
ReferenceError | 弱引用(Weak reference)試圖訪問已經垃圾回收了的對象 |
RuntimeError | 一般的運行時錯誤 |
NotImplementedError | 尚未實現的方法 |
SyntaxError | Python 語法錯誤 |
IndentationError | 縮進錯誤 |
TabError | Tab 和空格混用 |
SystemError | 一般的解釋器系統錯誤 |
TypeError | 對類型無效的操作 |
ValueError | 傳入無效的參數 |
UnicodeError | Unicode 相關的錯誤 |
UnicodeDecodeError | Unicode 解碼時的錯誤 |
UnicodeEncodeError | Unicode 編碼時錯誤 |
UnicodeTranslateError | Unicode 轉換時錯誤 |
Warning | 警告的基類 |
DeprecationWarning | 關於被棄用的特征的警告 |
FutureWarning | 關於構造將來語義會有改變的警告 |
OverflowWarning | 舊的關於自動提升為長整型(long)的警告 |
PendingDeprecationWarning | 關於特性將會被廢棄的警告 |
RuntimeWarning | 可疑的運行時行為(runtime behavior)的警告 |
SyntaxWarning | 可疑的語法的警告 |
UserWarning | 用戶代碼生成的警告 |