[英]Php selective exception handling
我有一個問題要捕獲所有異常,但自定義異常的后代除外。
可能是錯誤的設計,但是這里是(簡體字和名稱更改,但代碼相當准確):
function doStuff()
{
try {
// code
if (something) {
// manually throw an exception
throw StuffError("Something is bad.");
}
// a third-party code, can throw exceptions
LibraryClass::arcaneMagic();
} catch (Exception $e) {
throw new StuffError("Error occured while doing stuff: "
. $e->getMessage());
}
}
/** My custom exception */
class StuffError extends Exception
{
function __construct($msg) {
parent::__construct('StuffError: ' . $msg);
}
}
但是,這里的問題是我不希望try-catch攔截手動引發的StuffError。 或者,無縫地將其扔掉。
現在,我會得到:
StuffError:做事務時發生錯誤:StuffError:不好。
我只想:
StuffError:不好。
我該怎么辦?
您可以有多個catch
子句,第一個匹配的將是運行的子句。 因此,您可能會遇到這樣的事情:
try {
do_some_stuff();
}
catch (StuffError $e) {
throw $e;
}
catch (Exception $e) {
throw new StuffError(Error occurred while doing stuff: " . $e->getMessage());
}
但是您可能需要重新考慮包裝這樣的東西。 它掩蓋了錯誤的真正原因。 一方面,您會丟失堆棧跟蹤。 但這也使錯誤處理變得復雜,因為現在有人無法像您嘗試的那樣區分異常類型,而沒有嘗試解析異常消息(它本身就是反模式)。
我可能會誤解您,但我認為這是您要尋找的:
...
} catch (Exception $e) {
if (get_class($e) == 'StuffError' || is_subclass_of($e, 'StuffError')) {
throw $e;
} else {
throw new StuffError("Error occured while doing stuff: "
. $e->getMessage());
}
}
...
用上面的代碼替換您的catch語句。 它檢查該異常是StuffError還是StuffError的子類。 我仍然對為什么在捕獲后需要引發StuffError異常感到困惑,但這也許只是翻譯/清理代碼而產生的怪異之處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.