我有一個類,它公開了一個方法,該類的用戶應該呼叫該方法一定次數。方法被呼叫的次數是通過int物件構造期間的引數來達成一致的。因此,雖然呼叫它的次數太少可能是由于呼叫者出于某種原因決定取消操作,但過于頻繁地呼叫它顯然屬于編程錯誤,即std::logic_error. 我想知道在這種情況下是否會拋出更具體的例外,例如std::domain_error. cppreference.com 上的這個頁面說std::domain_error:
[...] 輸入在定義操作的域之外的情況
,這似乎與用例匹配。但是,我之所以問,是因為我不確定在這種情況下方法呼叫是否符合“輸入”的條件。在這種情況下應該拋出什么例外?
uj5u.com熱心網友回復:
在不適當的時間呼叫方法時拋出的正確例外是什么?
std::logic_error,最好是從中派生的結構/類。
struct PixelOverflowException : public std::logic_error {
PixelOverflowException() : std::logic_error("Cannot accept further pixels: resampled image is already complete.") {}
};
即使對于運行時例外(編程錯誤),派生也很有用,因為:
- 撰寫測驗檢查代碼在濫用情況下的行為會更容易。
- 如果呼叫者出于某種原因想要檢查特定例外,他們也可以這樣做。
- 這樣做沒有成本。見https://stackoverflow.com/a/44901257/593146
std::domain_error
std::domain_error是一種特定的型別std::logic_error,適用于理論上可以進行操作但在實踐中不可行的情況。例如,照片的檔案格式可能會將寬度和高度編碼為 32 位無符號整數,這意味著最多 4294967296(如果編碼值為 -1-biased)乘以 4294967296 = 18446744073709551616 像素。用于這種影像格式的解碼器的簡單實作可能會受限于某些寬度和高度,例如由于執行涉及寬度和高度的計算,這將在最大寬度和高度值出現之前很久就溢位。
uint32_t numPixels = width * height; // will overflow for width and height = 65536.
在這種情況下,解碼器應該拋出一個例外,std::domain_error而不是盲目地從事未定義的行為:檔案理論上可以解碼,但具體實作是無法做到的。
std::domain_error不同之處std::logic_error在于不需要拋出它的實作毫無疑問是可以想象的,如果只是在理論上如果需要的話。
需要強調的是,這兩個例外都暗示了呼叫方的錯誤,std::domain_error并不一定表明實作質量差或不完整:出于性能、可用??性或范圍的原因,可能會故意限制接受的輸入集。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/517466.html
標籤:C 例外
上一篇:用戶輸入的型別檢查并排除負數例外
