有沒有可能導致C++異常的「代碼語句」的完整列表(可能是遞歸定義的)?事情是這樣的:什麼(和什麼不能)在C++中拋出異常?
1)throw
聲明(自然)
2)調用new
3)調用從標準庫被記錄在案,以便能夠拋出任何功能。
4)調用任何包含1-3操作的用戶定義函數(包括構造函數)。
5)別的嗎?在堆棧上分配本地對象,對內置類型進行操作,取消引用指針,類型轉換 - 是否可以拋出?
6)其他一切都是免費的。
通過免例外我並不是指總是成功的操作。解引用指針肯定不是。但是,將它包裝在try-catch
塊中仍然沒有意義,請考慮函數解引用指針的異常安全性等。因此,成功或導致未定義行爲的代碼可以被視爲無異常。
Upd。儘管我最後一段我仍然有一個評論,未定義的行爲也可以拋出,所以讓我解釋我的意思。請考慮下面的代碼:
void bar();
Class C{
...
public:
foo() {
something_that_breaks_class_invariants;
bar();
something_that_restores_class_invariants;
}
}
如果我正確理解什麼異常安全之約,然後如果bar()
可以拋出異常,該代碼是壞的。我應該改變語句的順序,否則我應該把bar()
換成try-catch
塊,恢復類不變量並進一步傳播異常。如果bar()成功返回或導致未定義的行爲(因爲我不知道,其他東西已損壞),那麼foo()
就可以。 foo()
不能做任何事情,不應該關心bar()
的未定義行爲。在這個意義上bar()
是免費的,可以標記爲noexcept
等
所以我的問題是:什麼樣的語句可以在bar()
認爲它是免費的這種感覺?
先假設一切都可以拋出。那麼如果你需要證明它沒有。這是一個XY問題的味道。 –
任何未定義的行爲都可能導致拋出異常...... –
將'std :: vector :: at'包裝在try-catch中並沒有什麼意義。 – chris