《Erlang程式設計》學習筆記 第4章 異常

2021-08-26 02:01:16 字數 2195 閱讀 4967

第4章 異常

摘自:1. 丟擲異常的情況:(1)系統內部錯誤;(2)throw(exception);(3)exit(exception);(4)erlang:error(exception)

2. exit(why) 當當前程序想退出時要呼叫這個函式,它會產生異常。如果這個異常沒有**獲,那麼系統會向所有與當前程序相連線的程序廣播訊息。

3. throw(why) 丟擲乙個呼叫者會捕獲的異常

4. erlang:error(why) 丟擲乙個「崩潰錯誤」,這個錯誤呼叫者不會真正意識到要去處理,相當於系統內部的錯誤。

5. try...catch語法:

try funcorexpressionsequence of

pattern1 [when guard1] -> expressions1;

pattern2 [when guard2] -> expressions2;

... %% 最後乙個不能加分號

catch

exceptiontype: expattern1 [when exguard1] -> exexpressins1;

exceptiontype: expattern2 [when exguard2] -> exexpressins2;

... %% 最後乙個不能加分號

after

afterexpressions %% 這個不能加分號

end

規則:首先對funcorexpressionsequence進行求值,如果沒有異常則到pattern1、pattern2,如果有異常則到 catch,後面的expattern1、expattern2。其中exceptiontype是throw, exit, error中的乙個。無論是否有異常,after後面的**都要執行。try...catch表示式的值是expression的值(沒有異常)或 exexpressions的值(有異常)。afterexpressions的值會被捨棄。

問題:如果在pattern匹配時或在expression中出現異常會不會被catch捕捉到呢? 那是不會**捉的。

6. 縮減版:

try f

catch

...end

相當於

try f of

val -> val

catch

...end

7. catch原語:catch原語捕捉異常後將轉換為乙個描述錯誤的乙個元組。對於exit(a),catch捕捉後的元組是,但如果乙個表示式直接返回這樣乙個元組,那就不是乙個exit異常了。

8. 可以在判斷出現系統時用erlang:error()丟擲乙個異常,這樣的方法比系統直接丟擲的錯誤異常更具有可讀性。

9. 對於經常會返回錯誤的程式,可以用case表示式來兼顧多種返回值的情況,如:

case f(x) of

-> do_something_with(val);

-> %% do something

end,

10. 對於偶爾會出錯的程式,可以用try...catch表示式,如:

try f(x)

catch

throw: -> ...

throw: -> ...

end

其中在f(x)中要有對應的異常丟擲才有意思,如:throw()

11. 捕獲所有可能的異常:

try expr catch _:_ -> ... end

捕獲所有型別為throw的異常:

try expr catch _ -> ... end

12. 早期的erlang捕獲異常的方法是這樣的:

case (catch foo(...)) of

-> ...

val -> ...

end

這裡我們可以看出try應該是case的一種擴充,所以它們的語法很像。

13. erlang:get_stacktrace()函式可以顯示當前的棧跟蹤資訊,但其中不會有尾遞迴的資訊,實際上erlang的尾遞迴沒有壓棧。

學習筆記 第4章

standard 標準模式,呼叫startactivity殘生乙個例項 singletop 檢測是否已經存在乙個例項位於activitystack的頂部,如果存在就不產生新的勢力,否則呼叫newinstance產生新的勢力 singletask 在乙個新的task中產生這個勢力,以後每次呼叫都用此例...

《C Primer Plus》第4章 學習筆記

陣列 結構和指標是c 的3中符合型別。陣列可以在乙個資料物件中儲存多個同種型別的值。通過使用索引或下標,可以訪問陣列中各個元素。結構可以將多個不同型別的值儲存在同乙個資料物件中,可以使用成員關係運算子 來訪問其中的成員。使用結構的第一步是建立結構模板,它定義結構儲存了那些成員。模板的名稱將稱為新型別...

Go學習筆記 第4章 函式

使用關鍵字func定義函式。函式有一下特點 函式屬於第一類物件,具備相同簽名 引數以及返回值列表 的視作同一型別 func main func hello func exec f func 從閱讀和 維護的角度,使用命令型別更加方便 定義函式型別 type formatfunc func strin...