1 異常處理
import sys
try:
f = open("myfile.txt")
s = f.readline()
i = int(s.strip())
# except oserror as err:
# print("os error: ".format(err))
# except valueerror:
# print("could not convert data to an integer")
except (oserror,valueerror): #(error1,error2),異常元組
print("an error occurred")
except:#通配異常
print("unexpected error:",sys.exc_info()[0]) #print prompt message
raise #將異常繼續丟擲,給上層處理
else:#沒有發生異常
print("there is no error or execpetion in the programming code")
2 丟擲異常
#python使用raise語句丟擲乙個指定的異常
try:
raise valueerror("hithere")
except valueerror:
print("an exception flew by")
raise #如果你只想知道這是否丟擲了乙個異常,
# 並不想去處理它,那麼乙個簡單的 raise 語句就可以再次把它丟擲
3 使用者自定義異常
#使用者自定義異常
#你可以通過建立乙個新的exception類來擁有自己的異常。
# 異常應該繼承自 exception 類,或者直接繼承,或者間接繼承,
class myerror(exception):
def __init__(self,value):#類 exception 預設的 __init__() 被覆蓋。
self.value = value
def __str__(self):
return repr(self.value)
try:
raise myerror(2*2)
except myerror as e:
print("my exception occurred,value:",e.value)
#當建立乙個模組有可能丟擲多種不同的異常時,
# 一種通常的做法是為這個包建立乙個基礎異常類,然後基於這個基礎類為不同的錯誤情況建立不同的子類:
class error(exception):
"""base class for exceptions in this module."""
pass
class inputerror(error):
""" exception raised for errors in the input
attributes:
expression--input expression in which the error occurred
message --explanation of the error
"""def __init__(self,expression,message):
self.expression = expression
self.message = message
class transitionerror(error):
"""raised when an operation attempts a state transition that's not allowed
attributes:
previous -- state at beginning of transition
next -- attempted new state
message -- explanation of why the specific transition is not allowed
"""def __init__(self,previous,next,message):
self.previoud = previous
self.next = next
self.message = message
4 定義清理行為
>>> def divide(x, y):
try:
result = x / y
except zerodivisionerror:
print("division by zero!")
else:
print("result is", result)
finally:
print("executing finally clause")
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
traceback (most recent call last):
file "", line 1, in ?
file "", line 3, in divide
typeerror: unsupported operand type(s) for /: 'str' and 'str'
5 預定義的清理行為
#一些物件定義了標準的清理行為,無論系統是否成功的使用了它,一旦不需要它了,那麼這個標準的清理行為就會執行for line in open("myfile.txt"):
print(line,end="") #這段**的問題是,當執行完畢後,檔案保持開啟的轉態,並沒有關閉
with open("myfile.txt") as f:
for line in f:
Python程式設計中的錯誤與異常
到目前為止,我們還沒有提到錯誤訊息,但是如果你已經嘗試過那些例子,你可能已經看過了一些錯誤訊息。目前 至少 有兩種可區分的錯誤 語法錯誤 和 異常。語法錯誤 語法錯誤又稱解析錯誤,可能是你在學習python 時最容易遇到的錯誤 python程式設計中的錯誤與異常 解析器會輸出出現語法錯誤的那一行,並...
python 錯誤與異常
錯誤在執行前修改,邏輯錯誤無法修改 執行時,異常產生,檢查到錯誤且直譯器認為是異常,丟擲異常 異常處理,截獲異常,忽略或者終止程式處理異常 try try suite except exception e exception blocktry aexcept nameerror,e print ca...
python 錯誤與異常
開發人員在編寫程式的時候難免會遇到錯誤,那遇到錯誤要如何找到錯誤並處理異常呢?本篇主要實現異常的處理方法。一 錯誤分類 1.語法錯誤 syntaxerror 2.執行時錯誤 這種包括很多異常的型別,eg nameerror zerodivisionerror等 二 異常處理的基本語法 try 執行 ...