如果 try{} 塊中發生多個例外,并且 try{} 塊內只有一個 CATCH{} 塊,那么這個 CATCH{} 塊能否捕獲任何/所有例外?還是每個可能的例外都需要一個 CATCH{}?
try { CATCH { default { say "seenError" }; }; die "1"; die "2"; die "3" }
seenError
在上面的例子中,哪個“死”陳述句被捕獲了?第一個?如果我想處理每個例外,是否需要將每個可能的例外包含在一個單獨的 CATCH{} 中?
uj5u.com熱心網友回復:
首先:你不需要atry有一個CATCH塊。在 Raku 編程語言中,CATCH塊可以存在于任何詞法范圍內。
所以你的例子可以變成:
CATCH {
default { # $_ contains the exception
say .message; # show what the message was
}
}
die "1";
die "2";
die "3";
say "still alive";
如果你像這樣運行它,它只會說“1”,這意味著只捕獲了第一個例外。這是正確的,因為你沒有改變任何情況:例外仍然活躍,將導致你的程式終止。
您需要的是在處理例外后恢復執行。并且有一種方法:.resume. 它不適用于所有例外情況,但隨后您會被告知它不起作用。
將程式更改為:
CATCH {
default {
say .message;
.resume; # continue execution after where exception occurred
}
}
die "1";
die "2";
die "3";
say "still alive";
這將顯示“1”、“2”、“3”、“還活著”。
那么做try什么呢?基本上,它會CATCH為您添加一個塊,該塊將捕獲它看到的第一個例外,將例外放入$!并回傳Nil. 您可以將try塊視為將致命例外轉變為良性故障的一種方式。如果您對失敗的原因不感興趣,您可以使用它。并且try也可以是陳述句前綴。簡而言之:
say try die; # Nil
uj5u.com熱心網友回復:
(請不要忘記接受Liz的回答。這只是她回答的補充。)
正如 Liz 所說:
你不需要a
try有一個CATCH塊
而且,正如她所暗示的那樣,使用時您也不需要CATCH塊try:
for 1, 2, 3 {
try { print 'something ... '; .&die } or put "seenError: $!"
}
顯示:
something ... seenError: 1
something ... seenError: 2
something ... seenError: 3
正如 Liz還.resume概述的那樣,如果在處理 d 的代碼期間拋出例外而不是d try,或者如果存在未處理的 d,Failure則try捕獲例外/失敗,將相應的例外放入$!并回傳Nil。
我提到這一點是為了介紹一個可能感興趣的最終選項:trys,我創建它是為了回答 SOQ Returning values from exception handlers。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/442421.html
