天天看點

Erlang程序錯誤處理的術語含義

  1. 程序

    程序有兩種:普通程序和系統程序。spawn建立的是普通程序。普通程序可以通過執行内 置函數process_flag(trap_exit, true)變成系統程序,系統程序是一種能接收和處理錯誤信号的程序。

  2. 連接配接

    程序可以互相連接配接。如果A和B兩個程序有連接配接,而A出于某種原因終止了,就會向B發送 一個錯誤信号,反之亦然。

    為了建立連接配接,我們會調用基本函數link(Pid),它會在調用程序和Pid之間建立一個連接配接。 如:P1調用link(P3),P1和P3之間就會建立連接配接。

  3. 連接配接組

    程序P的連接配接組是指與P相連的一組程序。

    如果P1調用了link(P3),P3又調用了link(P10),P1的連接配接組隻有一個元素(P3),而P3的連接配接組有兩個元素(P1和P10),以此類推。

    a.同步終止的程序組 :

    假設我們有一些互相連接配接的程序而其中的某個程序挂了,錯誤信号會被發送給與它相連的所有程序。最後,錯誤信号擴散到了所有相連的程序,整個互連程序組都終止了。

    b.設立防火牆 :

    有時候我們不希望相連的程序全部終止,而是想讓系統裡的錯誤停止擴散.要實作這一點,可以執行process_flag(trap_exit, true)把程序轉變成一個系統程序(意思是它可以捕捉退出信号),,阻止錯誤擴散到系統裡的其他程序中。

  4. 監視

    監視和連接配接很相似,但它是單向的。如果A監視B,而B出于某種原因終止了,就會向A發 送一個“當機”消息,但反過來就不行了。

  5. 消息和錯誤信号

    程序協作的方式是交換消息或錯誤信号。消息是通過基本函數send發送的,錯誤信号則 是程序崩潰或程序終止時自動發送的。錯誤信号會發送給終止程序的連接配接組。

  6. 錯誤信号的接收

    當系統程序收到錯誤信号時,該信号會被轉換成{‘EXIT’, Pid, Why}形式的消息。Pid 是終止程序的辨別,Why是終止原因(有時候被稱為退出原因)。如果程序是無錯誤終止, Why就會是原子normal,否則Why會是錯誤的描述。

    當普通程序收到錯誤信号時,如果退出原因不是normal,該程序就會終止。當它終止時, 同樣會向它的連接配接組廣播一個退出信号

  7. 顯式錯誤信号

    任何執行exit(Why)的程序都會終止(如果代碼不是在catch或try的範圍内執行的話), 并向它的連接配接組廣播一個帶有原因Why的退出信号。 程序可以通過執行exit(Pid, Why)來發送一個“虛假”的錯誤信号。在這種情況下,Pid會 收到一個帶有原因Why的退出信号。調用exit/2的程序則不會終止(這是有意如此的)。

  8. 不可捕捉的退出信号

    系統程序收到摧毀信号(kill signal)時會終止。摧毀信号是通過調用exit(Pid, kill) 生成的。這種信号會繞過正常的錯誤信号處理機制,不會被轉換成消息。摧毀信号隻應該 用在其他錯誤處理機制無法終止的頑固程序上。