<font id="zqva1"></font>
<rt id="zqva1"></rt>
  • <tt id="zqva1"></tt>
    <cite id="zqva1"></cite>

    <cite id="zqva1"><noscript id="zqva1"></noscript></cite>
      <rp id="zqva1"><meter id="zqva1"></meter></rp>

        <cite id="zqva1"></cite>
          <b id="zqva1"></b>
          <rp id="zqva1"></rp>
          <cite id="zqva1"></cite>

          <rt id="zqva1"></rt>

        1. <rp id="zqva1"></rp>

          Python 錯誤和異常

          時間:?2019-08-27閱讀:?26標簽:?Python

          錯誤和異常

          在編寫代碼的時候,先不管出于什么原因,在運行階段,可能都看到過一些錯誤的信息。這些信息當中(至少)有兩種可區分的錯誤:語法錯誤 和 異常


          語法錯誤

          語法錯誤也叫解析錯誤,這可能在學習編碼中最容易遇到的錯誤:

          >>> while True print('Hello World')
            File "<stdin>", line 1
              while True print('Hello World')
                             ^
          SyntaxError: invalid syntax

          當出現錯誤時,解釋器會輸出出現語法錯誤的那行,同時會顯示 ^ 符號標記檢測到的錯誤。符號標記的位置表示錯誤出現在此處(或表示至少錯誤是在此處被檢測出)。在這個示例中,print() 函數被檢測出錯誤,這是因為前面的條件語句少了個冒號(:)。在錯誤信息中,會出現行號以及文件名,這都能方便在出現錯誤的時候到相應的位置檢查。


          異常

          有時候,檢查編寫的代碼發現并沒有什么語法錯誤,但在執行時,還是會引發錯誤。這種在執行時檢測到的錯誤被稱為異常。大多數異常并不會被程序處理,會顯示如下的錯誤信息:

          >>> 10 / 0
          Traceback (most recent call last):
            File "<stdin>", line 1, in <module>
          ZeroDivisionError: division by zero
          
          >>> x + 4
          Traceback (most recent call last):
            File "<stdin>", line 1, in <module>
          NameError: name 'x' is not defined
          
          >>> 1 + '1'
          Traceback (most recent call last):
            File "<stdin>", line 1, in <module>
          TypeError: unsupported operand type(s) for +: 'int' and 'str'

          如上示例,錯誤信息最后一行會告訴我們程序遇到的是什么類型的錯誤。在上面的例子中,出現的異常的類型分別是:ZeroDivisionError、NameError 和 TypeError。類型后面部分的信息則表示根據異常類型及其原因提供詳細的信息。


          異常處理

          python 內置 try...except... 錯誤處理機制。

          用例子看下 try...except... 機制:

          try:
              r = 10 / 0
              print('r=', r)
          except ZeroDivisionError as e:
              print('except:', e)
          
          print('END')

          程序運行結果如下:

          except: division by zero
          END

          在這里說明一下 try 語句的工作原理:

          • 首先,執行 try 子句(也就是 try 和 except 關鍵字之間的語句)。
          • 如果這個時候沒有異常產生,則會跳過 except 子句,完成 try 語句的執行。
          • 如果在執行 try 子句的時候發生異常,則會跳過該子句中剩下的部分(例如這個例子中,10 / 0 會產生異常,后面的 print('r=', r) 語句并沒有執行)。這個時候,如果異常的類型與 except 關鍵字后面的異常類型匹配,則會執行 except 子句。最后繼續執行整個 try 語句之后的代碼(例如本例子中 print('END'))。
          • 如果發生的異常和 except 關鍵字后面指定的異常不匹配,則會向外部進行傳遞;若是沒有找到處理程序,則認定為未處理異常,執行的時候將會停止,并顯示前面提及的錯誤信息。

          在這個例子當中, try 子句中的 10 / 0 出現異常,故后面的 print() 子句的內容并沒有輸出。然后,與 except 后面的異常匹配,所以輸出異常信息 except: division by zero,最后輸出整個 try 語句之后的 print('END') 語句。

          這就是 try...except... 捕獲異常處理異常的大致原理。

          try...except 語句后面還有一個可選的 else 子句,使用時放在 except 子句后面。在 try 子句不發生異常時執行。對前面的例子進行一些修改,比如:

          try:
              r = 10 / 1
              print('r=', r)
          except ZeroDivisionError as e:
              print('except:', e)
          else:
              print('No error!')
          
          print('END')

          最終輸出的結果:

          r= 10.0
          No error!
          END


          拋出異常

          raise 語句允許編碼者強制拋出指定異常。例如:

          >>> raise NameError('An error occurred here')
          Traceback (most recent call last):
            File "<stdin>", line 1, in <module>
          NameError: An error occurred here

          raise 唯一的參數就是要拋出的異常。這個參數必須是一個異常實例或者是一個異常類(派生自 Exception 的類)。

          如果是打算確定是否發生了異常,但不打算處理的情況下,可以使用簡單的 raise 語句形式重新引發異常。比如:

          >>> try:
          ...     raise NameError('An error occurred here.')
          ... except NameError:
          ...     print('An exception flew by!')
          ...     raise
          ...
          An exception flew by!
          Traceback (most recent call last):
            File "<stdin>", line 2, in <module>
          NameError: An error occurred here.


          自定義異常類

          程序可以通過創建新的異常類來命名自己的異常。自定義異常類通常直接或間接從 Exception 類派生。

          class Error(Exception):
              '''基類
              '''
              pass
          
          class InputError(Error):
              '''輸入表達式錯誤時引發異常
          
              Attributes:
                  expression -- 輸入表達式
                  message -- 異常輸出的信息
              '''
              def __init__(self, expression, message):
                  self.expression = expression
                  self.message = message
          
          class TransitionError(Error):
              '''狀態轉換不被允許時拋出異常
          
              Attributes:
                  previous -- 轉換前的狀態
                  next -- 轉換后新的狀態
                  message -- 狀態轉換不被允許的說明
              '''
              def __init__(self, previous, next, message):
                  self.previous = previous
                  self.next = next
                  self.message = message

          一般情況下,自定義異常名稱都以 Error 結尾,類似于標準異常的命名。


          定義清理操作

          try 語句還有一個可選子句 finally。用于定義必須在所有情況下都執行的清理操作。例如:

          >>> def divide(a, b):
          ...     try:
          ...         res = a / b
          ...     except ZeroDivisionError:
          ...         print('division by zero!')
          ...     else:
          ...         print('res =', res)
          ...     finally:
          ...         print('executing finally clause')
          ...
          >>> divide(10, 1)
          res = 10.0
          executing finally clause
          
          >>> divide(10, 0)
          division by zero!
          executing finally clause
          
          >>> divide('10', '1')
          executing finally clause
          Traceback (most recent call last):
            File "<stdin>", line 1, in <module>
            File "<stdin>", line 3, in divide
          TypeError: unsupported operand type(s) for /: 'str' and 'str'

          在這里,可以看到,無論什么情況,finally 最終都會被執行。最后的例子中,由于兩個字符串相除并沒有被 except 子句處理,這里也在執行 finally 子句后,拋出 TypeError 異常。

          finally 子句對于釋放外部資源(比如讀寫文件或者網絡連接)非常有用,無論是否成功使用資源。


          預定義的清理操作

          先看一段示例代碼:

          for line in open('file.txt'):
              print(line, end='')

          其實這段代碼有一個問題,它在這部分代碼執行結束之后,會在一段不確定的時候,讓 file 對象一直保持打開的狀態。這里可能對簡單的腳本并沒有太大的影響,但若是程序足夠大的話,這里將會是個問題。

          python 提供一個 with 語句,允許支持上下文管理協議的對象能夠確保它們得到及時和正確的清理:

          with open('file.txt') as f:
              for line in f:
                  print(line, end='')

          在這里,文件 f 始終會被關閉,不至于浪費資源。


          來源

          1. "8. Errors and Exceptions".docs.python.org.Retrieved 24 February 2020.
          2. "Exception hierarchy".docs.python.org.Retrieved 25 February 2020.
          歡迎關注微信公眾號《書所集錄》
          吐血推薦

          1.站長廣告聯盟: 整理了目前主流的廣告聯盟平臺,如果你有流量,可以作為參考選擇適合你的平臺點擊進入...

          2.休閑娛樂: 直播/交友    優惠券領取   網頁游戲   H5游戲

          鏈接: http://www.modern-decoration.com.cn/article/detial/7788

          常見Python的Web開發框架

          web開發框架存在的意義就在于可以快速便捷的構建應用,而不用去在意那些沒必要的技術細節,到2020年為止,基于Python創建的的web應用已經非常多了,國外知名的有youtube.com、instagram、reditt、國內有知乎、豆瓣等等

          寫 Python 代碼不可不知的函數式編程技術

          在 Python 中,函數是「頭等公民」(first-class)。也就是說,函數與其他數據類型(如 int)處于平等地位。因而,我們可以將函數賦值給變量,也可以將其作為參數傳入其他函數

          Python 實現單例模式

          而且上面這種方法只有第一次 get_instance() 的時候能給對象傳遞參數,總之有許多弊端。Python 提供了 __new__ 方法正好完美解決了這個問題,再加上鎖,就能實現一個線程安全的單例模式:

          Python 中 3 個不可思議的返回

          Python 字典通過檢查鍵值是否相等和比較哈希值來確定兩個鍵是否相同.具有相同值的不可變對象在Python中始終具有相同的哈希值.注意: 具有不同值的對象也可能具有相同的哈希值(哈希沖突)

          11 個優秀的 Python 編譯器和解釋器

          Python 是一門對初學者友好的編程語言,是一種多用途的、解釋性的和面向對象的高級語言。它擁有非常小的程序集,非常易于學習、閱讀和維護。其解釋器可在Windows、Linux 和 Mac OS 等多種操作系統上使用

          如何選擇異步Web Python框架

          Python在3.4引入了 asyncio 庫,3.6新增了關鍵字 async 和 await ,此后,異步框架迅速發展了起來,性能上能和Node.js比肩,除非是CPU密集型任務,否則沒有理由不適用異步框架

          25個超有用的Python代碼段

          Python是一種通用的高級編程語言。用它可以做許多事,比如開發桌面 GUI 應用程序、網站和 Web 應用程序等。作為一種高級編程語言,Python 還可以讓你通過處理常見的編程任務來專注應用程序的核心功能。

          python實用技巧

          Python 提供了一個直觀的在一行代碼中賦值與交換(變量值)的方法,請參見下面的示例,賦值的右側形成了一個新的元組,左側立即解析(unpack)那個(未被引用的)元組到變量 <x> 和 <y>。

          nodejs中怎么調用python函數?

          每種語言都有自己的優勢,互相結合起來各取所長程序執行起來效率更高或者說哪種實現方式較簡單就用哪個,nodejs是利用子進程來調用系統命令或者文件,NodeJS子進程提供了與系統交互的重要接口,其主要API有: 標準輸入

          30個非常實用的Python技巧

          Python 是機器學習最廣泛采用的編程語言,它最重要的優勢在于編程的易用性。如果讀者對基本的 Python 語法已經有一些了解,那么這篇文章可能會給你一些啟發。作者簡單概覽了 30 段代碼,它們都是平常非常實用的技巧

          fly63.com版權所有,內容以共享、參考、研究為目的,不存在任何商業目的。其版權屬原作者所有,如有侵權,請與小編聯系!情況屬實本人將予以刪除!

          文章投稿關于web前端網站點搜索站長推薦網站地圖站長QQ:522607023

          小程序專欄: 土味情話心理測試腦筋急轉彎幽默笑話段子句子語錄成語大全

          国产精品高清视频免费 - 视频 - 在线观看 - 影视资讯 - 唯爱网