成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

SICP Python 描述 3.4 異常

pkhope / 1202人閱讀

摘要:的最常見的作用是構(gòu)造異常實例并拋出它。子句組只在執(zhí)行過程中的異常產(chǎn)生時執(zhí)行。每個子句指定了需要處理的異常的特定類。將強制轉(zhuǎn)為字符串會得到由返回的人類可讀的字符串。

3.4 異常

來源:3.4 Exceptions

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

程序員必須總是留意程序中可能出現(xiàn)的錯誤。例子數(shù)不勝數(shù):一個函數(shù)可能不會收到它預(yù)期的信息,必需的資源可能會丟失,或者網(wǎng)絡(luò)上的連接可能丟失。在設(shè)計系統(tǒng)時,程序員必須預(yù)料到可能產(chǎn)生的異常情況并且采取適當(dāng)?shù)卮胧﹣硖幚硭鼈儭?/p>

處理程序中的錯誤沒有單一的正確方式。為提供一些持久性服務(wù)而設(shè)計的程序,例如 Web 服務(wù)器 應(yīng)該對錯誤健壯,將它們記錄到日志中為之后考慮,而且在盡可能長的時間內(nèi)繼續(xù)接受新的請求。另一方面,Python 解釋器通過立即終止以及打印錯誤信息來處理錯誤,便于程序員在錯誤發(fā)生時處理它。在任何情況下,程序員必須決定程序如何對異常條件做出反應(yīng)。

異常是這一節(jié)的話題,它為程序的錯誤處理提供了通用的機制。產(chǎn)生異常是一種技巧,終止程序正常執(zhí)行流,發(fā)射異常情況產(chǎn)生的信號,并直接返回到用于響應(yīng)異常情況的程序的封閉部分。Python 解釋器每次在檢測到語句或表達式錯誤時拋出異常。用戶也可以使用raiseassert語句來拋出異常。

拋出異常。異常是一個對象實例,它的類直接或間接繼承自BaseException類。第一章引入的assert語句產(chǎn)生AssertionError類的異常。通常,異常實例可以使用raise語句來拋出。raise語句的通用形式在 Python 文檔中描述。raise的最常見的作用是構(gòu)造異常實例并拋出它。

>>> raise Exception("An error occurred")
Traceback (most recent call last):
  File "", line 1, in 
Exception: an error occurred

當(dāng)異常產(chǎn)生時,當(dāng)前代碼塊的語句不會繼續(xù)執(zhí)行。除非異常被解決了(下面會描述),解釋器會直接返回到“讀取-求值-打印”交互式循環(huán)中,或者在 Python 以文件參數(shù)啟動的情況下會完全終止。此外,解釋器會打印?;厮?,它是結(jié)構(gòu)化的文本塊,描述了執(zhí)行分支中的一系列嵌套的活動函數(shù),它們是異常產(chǎn)生的位置。在上面的例子中,文件名稱表示異常由用戶在交互式會話中產(chǎn)生,而不是文件中的代碼。

處理異常。異常可以使用封閉的try語句來處理。try語句由多個子句組成,第一個子句以try開始,剩下的以except開始。

try:
    
except  as :
    
...

當(dāng)try語句執(zhí)行時,總是會立即執(zhí)行。except子句組只在執(zhí)行過程中的異常產(chǎn)生時執(zhí)行。每個except子句指定了需要處理的異常的特定類。例如,如果AssertionError,那么任何繼承自AssertionError的類實例都會被處理,標(biāo)識符 綁定到所產(chǎn)生的異常對象上,但是這個綁定在之外并不有效。

例如,我們可以使用try語句來處理異常,在異常發(fā)生時將x綁定為0。

>>> try:
        x = 1/0
    except ZeroDivisionError as e:
        print("handling a", type(e))
        x = 0
handling a 
>>> x
0

try語句能夠處理產(chǎn)生在函數(shù)體中的異常,函數(shù)在中調(diào)用。當(dāng)異常產(chǎn)生時,控制流會直接跳到最近的try語句的能夠處理該異常類型的的主體中。

>>> def invert(x):
        result = 1/x  # Raises a ZeroDivisionError if x is 0
        print("Never printed if x is 0")
        return result
>>> def invert_safe(x):
        try:
            return invert(x)
        except ZeroDivisionError as e:
            return str(e)
>>> invert_safe(2)
Never printed if x is 0
0.5
>>> invert_safe(0)
"division by zero"

這個例子表明,invert中的print表達式永遠不會求值,反之,控制流跳到了handler中的except子句組中。將ZeroDivisionError e強制轉(zhuǎn)為字符串會得到由handler: "division by zero"返回的人類可讀的字符串。

3.4.1 異常對象

異常對象本身就帶有屬性,例如在assert語句中的錯誤信息,以及有關(guān)異常產(chǎn)生處的信息。用戶定義的異常類可以攜帶額外的屬性。

在第一章中,我們實現(xiàn)了牛頓法來尋找任何函數(shù)的零點。下面的例子定義了一個異常類,無論何時ValueError出現(xiàn),它都返回迭代改進過程中所發(fā)現(xiàn)的最佳猜測值。數(shù)學(xué)錯誤(ValueError的一種)在sqrt在負數(shù)上調(diào)用時產(chǎn)生。這個異常由拋出IterImproveError處理,它將牛頓迭代法的最新猜測值儲存為參數(shù)。

首先,我們定義了新的類,繼承自Exception

>>> class IterImproveError(Exception):
        def __init__(self, last_guess):
            self.last_guess = last_guess

下面,我們定義了IterImprove,我們的通用迭代改進算法的一個版本。這個版本通過拋出IterImproveError異常,儲存最新的猜測值來處理任何ValueError。像之前一樣,iter_improve接受兩個函數(shù)作為參數(shù),每個函數(shù)都接受單一的數(shù)值參數(shù)。update函數(shù)返回新的猜測值,而done函數(shù)返回布爾值,表明改進是否收斂到了正確的值。

>>> def iter_improve(update, done, guess=1, max_updates=1000):
        k = 0
        try:
            while not done(guess) and k < max_updates:
                guess = update(guess)
                k = k + 1
            return guess
        except ValueError:
            raise IterImproveError(guess)

最后,我們定義了find_root,它返回iter_improve的結(jié)果。iter_improve應(yīng)用于由newton_update返回的牛頓更新函數(shù)。newton_update定義在第一章,在這個例子中無需任何改變。find_root的這個版本通過返回它的最后一個猜測之來處理IterImproveError。

>>> def find_root(f, guess=1):
        def done(x):
            return f(x) == 0
        try:
            return iter_improve(newton_update(f), done, guess)
        except IterImproveError as e:
            return e.last_guess

考慮使用find_root來尋找2 * x ** 2 + sqrt(x)的零點。這個函數(shù)的一個零點是0,但是在任何負數(shù)上求解它會產(chǎn)生ValueError。我們第一章的牛頓法實現(xiàn)會產(chǎn)生異常,并且不能返回任何零點的猜測值。我們的修訂版實現(xiàn)在錯誤之前返回了最新的猜測值。

>>> from math import sqrt
>>> find_root(lambda x: 2*x*x + sqrt(x))
-0.030211203830201594

雖然這個近似值仍舊距離正確的答案0很遠,一些應(yīng)用更傾向于這個近似值而不是ValueError。

異常是另一個技巧,幫助我們將程序細節(jié)劃分為模塊化的部分。在這個例子中,Python 的異常機制允許我們分離迭代改進的邏輯,它在try子句組中沒有發(fā)生改變,以及錯誤處理的邏輯,它出現(xiàn)在except子句中。我們也會發(fā)現(xiàn),異常在使用 Python 實現(xiàn)解釋器時是個非常實用的特性。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/38159.html

相關(guān)文章

  • SICP Python 描述 3.5 組合語言的解釋器

    摘要:計算器語言解釋器的核心是叫做的遞歸函數(shù),它會求解樹形表達式對象。到目前為止,我們在描述求值過程中所引用的表達式樹,還是概念上的實體。解析器實際上由兩個組件組成,詞法分析器和語法分析器。標(biāo)記序列由叫做的詞法分析器產(chǎn)生,并被叫做語法分析器使用。 3.5 組合語言的解釋器 來源:3.5 Interpreters for Languages with Combination 譯者:飛龍 ...

    sanyang 評論0 收藏0
  • SICP Python 描述 第三章 計算機程序的構(gòu)造和解釋 3.1 引言

    摘要:為通用語言設(shè)計解釋器的想法可能令人畏懼。但是,典型的解釋器擁有簡潔的通用結(jié)構(gòu)兩個可變的遞歸函數(shù),第一個求解環(huán)境中的表達式,第二個在參數(shù)上調(diào)用函數(shù)。這一章接下來的兩節(jié)專注于遞歸函數(shù)和數(shù)據(jù)結(jié)構(gòu),它們是理解解釋器設(shè)計的基礎(chǔ)。 3.1 引言 來源:3.1 Introduction 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 第一章和第二章描述了編程的兩個基本元素:數(shù)據(jù)和函數(shù)之間的...

    v1 評論0 收藏0
  • SICP Python 描述 1.4 實踐指南:函數(shù)的藝術(shù)

    摘要:實踐指南函數(shù)的藝術(shù)來源譯者飛龍協(xié)議函數(shù)是所有程序的要素,無論規(guī)模大小,并且在編程語言中作為我們表達計算過程的主要媒介。目前為止,我們討論了函數(shù)的形式特性,以及它們?nèi)绾问褂?。第一行描述函?shù)的任務(wù)。 1.4 實踐指南:函數(shù)的藝術(shù) 來源:1.4 Practical Guidance: The Art of the Function 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 函...

    lemon 評論0 收藏0
  • SICP Python 描述 第二章 使用對象構(gòu)建抽象 2.1 引言

    摘要:對象表示信息,但是同時和它們所表示的抽象概念行為一致。通過綁定行為和信息,對象提供了可靠獨立的日期抽象。名稱來源于實數(shù)在中表示的方式浮點表示。另一方面,對象可以表示很大范圍內(nèi)的分?jǐn)?shù),但是不能表示所有有理數(shù)。 2.1 引言 來源:2.1 Introduction 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 在第一章中,我們專注于計算過程,以及程序設(shè)計中函數(shù)的作用。我們看到了...

    phoenixsky 評論0 收藏0
  • SICP Python 描述 第五章 序列和協(xié)程

    摘要:消息向迭代器獲取所表示的底層序列的下一個元素。為了對方法調(diào)用做出回應(yīng),迭代器可以執(zhí)行任何計算來獲取或計算底層數(shù)據(jù)序列的下一個元素。這個迭代器應(yīng)擁有方法,依次返回序列中的每個元素,最后到達序列末尾時產(chǎn)生異常。 第五章 序列和協(xié)程 來源:Chapter 5: Sequences and Coroutines 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 5.1 引言 在這一章中,我...

    leap_frog 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<