簡體   English   中英

PHP選擇性異常處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM