第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...