99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀Python 異常處理的實例詳解
Python 異常處理的實例詳解
2018-04-30
收藏

Python 異常處理的實例詳解

與許多面向對象語言一樣,Python 具有異常處理,通過使用 try...except 塊來實現(xiàn)。

Note: Python v s. Java 的異常處理

Python 使用 try...except 來處理異常,使用 raise 來引發(fā)異常。Java 和 C++ 使用 try...catch 來處理異常,使用 throw 來引發(fā)異常。

異常在 Python 中無處不在;實際上在標準 Python 庫中的每個模塊都使用了它們,并且 Python 自已會在許多不同的情況下引發(fā)它們。在整本書中你已經再三看到它們了。

? 使用不存在的字典關鍵字    將引發(fā) KeyError 異常。
? 搜索列表中不存在的值    將引發(fā) ValueError 異常。
? 調用不存在的方法    將引發(fā) AttributeError 異常。
? 引用不存在的變量    將引發(fā) NameError 異常。
? 未強制轉換就混用數(shù)據(jù)類型    將引發(fā) TypeError 異常。

在這些情況下,我們都在簡單地使用 Python IDE:一個錯誤發(fā)生了,異常被打印出來 (取決于你的 IDE,可能會有意地以一種刺眼的紅色形式表示),這便是。這叫做未處理異常;當異常被引發(fā)時,沒有代碼來明確地關注和處理它,所以異常被傳給置在 Python 中的缺省的處理,它會輸出一些調試信息并且終止運行。在 IDE 中,這不是什么大事,但是如果發(fā)生在你真正的 Python 程序運行的時候,整個程序將會終止。

然而,一個異常不一定會引起程序的完全崩潰。當異常引發(fā)時,可以被處理掉。有時候一個異常實際是因為代碼中的 bug (比如使用一個不存在的變量),但是許多時候,一個異常是可以預見的。如果你打開一個文件,它可能不存在。如果你連接一個數(shù)據(jù)庫,它可能不可連接或沒有訪問所需的正確的安全證書。如果知道一行代碼可能會引發(fā)異常,你應該使用一個 try...except 塊來處理異常。

1. 打開一個不存在的文件


>>> fsock=open("/notthere","r")   (1)
Traceback (innermost last):
 File"<interactive input>", line1,in?
IOError: [Errno2] No suchfileordirectory:'/notthere'
>>>try:
...   fsock=open("/notthere")    (2)
...exceptIOError:           (3)
...  print"The file does not exist, exiting gracefully"
...print"This line will always print"(4)
Thefiledoesnotexist, exiting gracefully
This line will alwaysprint

(1)  使用內置 open 函數(shù),我們可以試著打開一個文件來讀取 (在下一節(jié)有關于open 的更多內容)。但是那個文件不存在,所以這樣就引發(fā) IOError 異常。因為我們沒有提供任何顯式的對 IOError 異常的檢查,Python 僅僅打印出某個關于發(fā)生了什么的調試信息,然后終止。

(2)  我們試圖打開同樣不存在的文件,但是這次我們在一個 try...except 內來執(zhí)行它。

(3)  當 open 方法引發(fā) IOError 異常時,我們已經準備好處理它了。except IOError: 行捕捉異常,接著執(zhí)行我們自已的代碼塊,這個代碼塊在本例中只是打印出更令人愉快的錯誤信息。

(4)  一旦異常被處理了,處理通常在 try...except 塊之后的第一行繼續(xù)進行。注意這一行將總是打印出來,無論異常是否發(fā)生。如果在你的根目錄下確實有一個叫 notthere 的文件,對 open 的調用將成功,except 子句將忽略,并且最后一行仍將執(zhí)行。
異??赡芸瓷先ゲ挥押? (畢竟,如果你不捕捉異常,整個程序將崩潰),但是考慮一下別的方法。你該不會希望獲得一個指向不存在的文件的對象吧?不管怎么樣你都得檢查它的有效性,而且如果你忘記了,你的程序將會在下面某個地方給出奇怪的錯誤,這樣你將不得不追溯到源程序。我確信你做過這種事;這可并不有趣。使用異常,一發(fā)生錯誤,你就可以在問題的源頭通過標準的方法來處理它們。

2. 為其他用途使用異常

除了處理實際的錯誤條件之外,對于異常還有許多其它的用處。在標準 Python 庫中一個普通的用法就是試著導入一個模塊,然后檢查是否它能使用。導入一個并不存在的模塊將引發(fā)一個 ImportError 異常。你可以使用這種方法來定義多級別的功能――依靠在運行時哪個模塊是有效的,或支持多種平臺 (即平臺特定代碼被分離到不同的模塊中)。你也能通過創(chuàng)建一個從內置的 Exception 類繼承的類定義你自己的異常,然后使用 raise 命令引發(fā)你的異常。如果你對此感興趣,請看進一步閱讀的部分。

下面的例子演示了如何使用異常支持特定平臺功能。代碼來自 getpass 模塊,一個從用戶獲得口令的封裝模塊。獲得口令在 UNIX、Windows 和 Mac OS 平臺上的實現(xiàn)是不同的,但是這個代碼封裝了所有的不同之處。

# Bind the name getpass to the appropriate function
try:
  importtermios, TERMIOS           (1)
exceptImportError:
  try:
    importmsvcrt              (2)
  exceptImportError:
    try:
      fromEasyDialogsimportAskPassword (3)
    exceptImportError:
      getpass=default_getpass      (4)
    else:                  (5)
      getpass=AskPassword
  else:
    getpass=win_getpass
else:
  getpass=unix_getpass

(1)  termios 是 UNIX 獨有的一個模塊,它提供了對于輸入終端的底層控制。如果這個模塊無效 (因為它不在你的系統(tǒng)上,或你的系統(tǒng)不支持它),則導入失敗,Python 引發(fā)我們捕捉的 ImportError 異常。

(2)  OK,我們沒有 termios,所以讓我們試試 msvcrt,它是 Windows 獨有的一個模塊,可以提供在 Microsoft Visual C++ 運行服務中的許多有用的函數(shù)的一個 API。如果導入失敗,Python 會引發(fā)我們捕捉的 ImportError 異常。

(3)  如果前兩個不能工作,我們試著從 EasyDialogs 導入一個函數(shù),它是 Mac OS 獨有的一個模塊,提供了各種各樣類型的彈出對話框。再一次,如果導入失敗,Python 會引發(fā)一個我們捕捉的 ImportError 異常。

(4)  這些平臺特定的模塊沒有一個有效 (有可能,因為 Python 已經移植到了許多不同的平臺上了),所以我們需要回頭使用一個缺省口令輸入函數(shù) (這個函數(shù)定義在 getpass 模塊中的別的地方)。注意我們在這里所做的:我們將函數(shù) default_getpass 賦給變量 getpass。如果你讀了官方 getpass 文檔,它會告訴你 getpass 模塊定義了一個 getpass 函數(shù)。它是這樣做的:通過綁定 getpass 到正確的函數(shù)來適應你的平臺。然后當你調用 getpass 函數(shù)時,你實際上調用了平臺特定的函數(shù),是這段代碼已經為你設置好的。你不需要知道或關心你的代碼正運行在何種平臺上;只要調用 getpass,則它總能正確處理。

(5)  一個 try...except 塊可以有一條 else 子句,就像 if 語句。如果在 try 塊中沒有異常引發(fā),然后 else 子句被執(zhí)行。在本例中,那就意味著如果 from EasyDialogs import AskPassword 導入可工作,所以我們應該綁定 getpass 到 AskPassword 函數(shù)。其它每個 try...except 塊有著相似的 else 子句,當我們發(fā)現(xiàn)一個 import 可用時,就綁定 getpass 到適合的函數(shù)。



數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師考試動態(tài)
數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調,回調的第一個參數(shù)驗證碼對象,之后可以使用它調用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }