㈠ python求解:猜數字游戲新建文件以及異常處理
就是try的使用。
鍵盤輸入的可能不是數字,是字母,漢字什麼的,這樣你的int(input())就會異常中斷。
所以要添加try,來做異常處理
㈡ Python中異常重試的解決方案詳解
Python中異常重試的解決方案詳解
大家在做數據抓取的時候,經常遇到由於網路問題導致的程序保存,先前只是記錄了錯誤內容,並對錯誤內容進行後期處理。
原先的流程:
def crawl_page(url):
pass
def log_error(url):
pass
url = ""
try:
crawl_page(url)
except:
log_error(url)
改進後的流程:
attempts = 0
success = False
while attempts < 3 and not success:
try:
crawl_page(url)
success = True
except:
attempts += 1
if attempts == 3:
break
最近發現的新的解決方案:retrying
retrying是一個 Python的重試包,可以用來自動重試一些可能運行失敗的程序段。retrying提供一個裝飾器函數retry,被裝飾的函數就會在運行失敗的條件下重新執行,默認只要一直報錯就會不斷重試。
import random
from retrying import retry
@retry
def do_something_unreliable():
if random.randint(0, 10) > 1:
raise IOError("Broken sauce, everything is hosed!!!111one")
else:
return "Awesome sauce!"
print do_something_unreliable()
如果我們運行have_a_try函數,那麼直到random.randint返回5,它才會執行結束,否則會一直重新執行。
retry還可以接受一些參數,這個從源碼中Retrying類的初始化函數可以看到可選的參數:
stop_max_attempt_number:用來設定最大的嘗試次數,超過該次數就停止重試
stop_max_delay:比如設置成10000,那麼從被裝飾的函數開始執行的時間點開始,到函數成功運行結束或者失敗報錯中止的時間點,只要這段時間超過10秒,函數就不會再執行了
wait_fixed:設置在兩次retrying之間的停留時間
wait_random_min和wait_random_max:用隨機的方式產生兩次retrying之間的停留時間
wait_exponential_multiplier和wait_exponential_max:以指數的形式產生兩次retrying之間的停留時間,產生的值為2^previous_attempt_number * wait_exponential_multiplier,previous_attempt_number是前面已經retry的次數,如果產生的這個值超過了wait_exponential_max的大小,那麼之後兩個retrying之間的停留值都為wait_exponential_max。這個設計迎合了exponential backoff演算法,可以減輕阻塞的情況。
我們可以指定要在出現哪些異常的時候再去retry,這個要用retry_on_exception傳入一個函數對象:
def retry_if_io_error(exception):
return isinstance(exception, IOError)
@retry(retry_on_exception=retry_if_io_error)
def read_a_file():
with open("file", "r") as f:
return f.read()
在執行read_a_file函數的過程中,如果報出異常,那麼這個異常會以形參exception傳入retry_if_io_error函數中,如果exception是IOError那麼就進行retry,如果不是就停止運行並拋出異常。
我們還可以指定要在得到哪些結果的時候去retry,這個要用retry_on_result傳入一個函數對象:
def retry_if_result_none(result):
return result is None
@retry(retry_on_result=retry_if_result_none)
def get_result():
return None
在執行get_result成功後,會將函數的返回值通過形參result的形式傳入retry_if_result_none函數中,如果返回值是None那麼就進行retry,否則就結束並返回函數值。
㈢ python中異常處理的使用方法
8.3. 異常處理
通過編程處理選擇的異常是可行的。看一下下面的例子:它會一直要求用戶輸入,直到輸入一個合法的整數為止,但允許用戶中斷這個程序(使用 Control-C 或系統支持的任何方法)。注意:用戶產生的中斷會引發一個 KeyboardInterrupt 異常。
>>> while True:
... try:
... x = int(input("Please enter a number: "))
... break
... except ValueError:
... print("Oops! That was no valid number. Try again...")
...
try 語句按如下方式工作。
首先,執行 try 子句 (在 try 和 except 關鍵字之間的部分)。
如果沒有異常發生, except 子句 在 try 語句執行完畢後就被忽略了。
如果在 try 子句執行過程中發生了異常,那麼該子句其餘的部分就會被忽略。
如果異常匹配於 except 關鍵字後面指定的異常類型,就執行對應的except子句。然後繼續執行 try 語句之後的代碼。
如果發生了一個異常,在 except 子句中沒有與之匹配的分支,它就會傳遞到上一級 try 語句中。
如果最終仍找不到對應的處理語句,它就成為一個 未處理異常,終止程序運行,顯示提示信息。
一個 try 語句可能包含多個 except 子句,分別指定處理不同的異常。至多隻會有一個分支被執行。異常處理程序只會處理對應的 try 子句中發生的異常,在同一個 try 語句中,其他子句中發生的異常則不做處理。一個 except 子句可以在括弧中列出多個異常的名字,例如:
... except (RuntimeError, TypeError, NameError):
... pass
最後一個 except 子句可以省略異常名稱,以作為通配符使用。你需要慎用此法,因為它會輕易隱藏一個實際的程序錯誤!可以使用這種方法列印一條錯誤信息,然後重新拋出異常(允許調用者處理這個異常):
㈣ python中異常問題
try:
raiseException('spam','eggs')
exceptExceptionasinst:
printtype(inst)
#theexceptioninstance
printinst.args
#argumentsstoredin.args
printinst
#__str__allowsargstobeprinteddirectly
x,y=inst.args
print'x=',x
print'y=',y...
raise就是拋出一個異常,和Java裡面的throw相同。具體查看python api
㈤ python中異常處理的問題
意思是在使用with這個關鍵字操作文件的時候不需要額外的處理異常,也就是把下邊的第一段代碼,替換成了第二段代碼,但是功能相同
try:
f=open('file_name','r')
finally:
f.close()
withopen('file_name','r')asf:
foriinf:
None
㈥ Python異常處理知識點匯總,五分鍾就能學會
什麼是異常?
1.錯誤
從軟體方面來說,錯誤是語法或是邏輯上的。錯誤是語法或是邏輯上的。
語法錯誤指示軟體的結構上有錯誤,導致不能被解釋器解釋或編譯器無法編譯。這些些錯誤必須在程序執行前糾正。
當程序的語法正確後,剩下的就是邏輯錯誤了。邏輯錯誤可能是由於不完整或是不合法的輸入所致;
在其它情況下,還可能是邏輯無法生成、計算、或是輸出結果需要的過程無法執行。這些錯誤通常分別被稱為域錯誤和范圍錯誤。
當python檢測到一個錯誤時,python解釋器就會指出當前流已經無法繼續執行下去。這時候就出現了異常。
2.異常
對異常的最好描述是:它是因為程序出現了錯誤而在正常控制流以外採取的行為。
這個行為又分為兩個階段:首先是引起異常發生的錯誤,然後是檢測(和採取可能的措施)階段。
第一階段是在發生了一個異常條件(有時候也叫做例外的條件)後發生的。
只要檢測到錯誤並且意識到異常條件,解釋器就會發生一個異常。引發也可以叫做觸發,拋出或者生成。解釋器通過它通知當前控制流有錯誤發生。
python也允許程序員自己引發異常。無論是python解釋器還是程序員引發的,異常就是錯誤發生的信號。
當前流將被打斷,用來處理這個錯誤並採取相應的操作。這就是第二階段。
對於異常的處理發生在第二階段,異常引發後,可以調用很多不同的操作。
可以是忽略錯誤(記錄錯誤但不採取任何措施,採取補救措施後終止程序。)或是減輕問題的影響後設法繼續執行程序。
所有的這些操作都代表一種繼續,或是控制的分支。關鍵是程序員在錯誤發生時可以指示程序如何執行。
python用異常對象(exception object)來表示異常。遇到錯誤後,會引發異常。
如果異常對象並未被處理或捕捉,程序就會用所謂的回溯(traceback)終止執行
異常處理
捕捉異常可以使用try/except語句。
try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。
如果你不想在異常發生時結束你的程序,只需在try里捕獲它。
語法:
以下為簡單的try....except...else的語法:
Try的工作原理是,當開始一個try語句後,python就在當前程序的上下文中作標記,這樣當異常出現時就可以回到這里,try子句先執行,接下來會發生什麼依賴於執行時是否出現異常。
如果當try後的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。
如果在try後的語句里發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結束程序,並列印預設的出錯信息)。
如果在try子句執行時沒有發生異常,python將執行else語句後的語句(如果有else的話),然後控制流通過整個try語句。
使用except而不帶任何異常類型
可以不帶任何異常類型使用except,如下實例:
以上方式try-except語句捕獲所有發生的異常。但這不是一個很好的方式,我們不能通過該程序識別出具體的異常信息。因為它捕獲所有的異常。
㈦ python中的異常類的認識理解
9.8. 異常也是類
用戶自定義異常也可以是類。利用這個機制可以創建可擴展的異常體系。
以下是兩種新的,有效的(語義上的)異常拋出形式,使用 raise 語句:
raise Class
raise Instance
第一種形式中,Class 必須是 type 或其派生類的一個實例。第二種形式是以下形式的簡寫:
raise Class()
發生的異常其類型如果是 except 子句中列出的類,或者是其派生類,那麼它們就是相符的(反過來說--發生的異常其類型如果是異常子句中列出的類的基類,它們就不相符)。例如,以下代碼會按順序列印 B,C,D:
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
for cls in [B, C, D]:
try:
raise cls()
except D:
print("D")
except C:
print("C")
except B:
print("B")
要注意的是如果異常子句的順序顛倒過來( execpt B 在最前),它就會列印 B,B,B--第一個匹配的異常被觸發。
列印一個異常類的錯誤信息時,先列印類名,然後是一個空格、一個冒號,然後使用內置函數 str() 將類轉換得到的完整字元串。
㈧ 請教:python如何處理異常
異常種類
python中的異常種類非常多,每個異常專門用於處理某一項異常!!!
下面是一些常用的異常:
異常基礎
在編程過程中為了增加友好性、容錯性和健壯性,在程序出現bug時一般不會將錯誤信息顯示給用戶,而是現實一個提示的頁面,通俗來說就是不讓用戶看見大黃頁!!!還有,有時我們不希望一個小bug的出現讓整個程序都崩潰,自動退出或者藍屏,我們需要抓取這個錯誤異常,並進行處理,讓用戶能夠繼續使用下去。
註:在python3中,except Exception , ex的別名方法已經不能使用,逗號被認為是兩種異常的分隔符,而不是取別名。
下面是一個實例:
更多的異常在這里:
如果程序發生的異常不在你設定的異常之中,那麼依然會報錯。
這個例子中,你只設置了捕獲IndexError,而實際會發生一個ValueError,因此它依然會報錯。
要同時捕獲多個異常如何寫呢?
程序會按異常的先後順序進行捕獲,任意一個被捕獲,則進行異常處理,並忽略try會後的代碼和別的異常處理代碼。
萬能異常:Exception
在python的異常中,有一個萬能異常:Exception,他可以捕獲任意異常,相當於一個人把所有的活全乾了。那你可能要問了,既然有這個萬能異常,其他異常是不是就可以不需要了!
當然不是,對於特殊處理或提醒的異常需要先定義,用於准確判斷錯誤類型,存儲錯誤日誌,而最後定義Exception用來確保程序正常運行。
㈨ 求大神給講講python的異常問題!以下是我的代碼!沒看出來有什麼不同的呀
應該是
finally:
f.close()
表示在try的最後無論出不出錯都要把f關閉了
except: 表示出錯的時候才執行這里的內容
但實際上f如果沒關的話在程序退出的時候python也會自動把它關了,所以在你這個程序中看不出區別
㈩ 關於python教程中處理異常的問題
EOF為"文件結束符",在linux終端中按Ctrl-D就是向終端輸入EOF,在windows的cmd中Ctrl-Z是EOF.
而且在輸入後需要按回車鍵.'\n'代表linux的換行符,就是另起一行的符號,直接輸入'\n'只是代表你輸入了'\'字元和'n'字元,是兩個字元.