2016-12-02 58 views
0

我試着約20嘗試&閱讀大量的網頁在過去2小時,不能找出我在做什麼錯在這裏:在C++類指明函數拋出自定義異常

#pragma once 
#include <exception> 
using namespace std; 

class EmptyHeap : public exception { 
public: 
    virtual const char* what() const throw() 
    { 
     return "The heap is empty!"; 
    } 
}; 

然後堆類,公共方法:

void remove() throw()//EmptyHeap 
{ 
    if (isEmpty()) 
    { 
     EmptyHeap broken; 
     throw broken; 
    } 
    ... 

此代碼的工作,但原來的標題是:

void remove() throw EmptyHeap; 

有沒有辦法指定一個方法在C++中拋出什麼異常,還是隻是一個Java事物?

+4

[正確的語法](http://en.cppreference.com/w/cpp/language/except_spec)是'throw(EmptyHeap)'(注意圓括號)。進一步注意,異常規範已被棄用。只要放下它。 –

+0

[C++異常規範替換](http://stackoverflow.com/q/14609329/669576) –

+1

請注意,這應該很可能不是一個例外。如何從「EmptyHeap」異常中「恢復」?從空堆中刪除某些內容是一種編程錯誤,因此正確的做法是爲'isEmpty'添加前提條件。這意味着你爲類的用戶記錄了前提條件,並在代碼中放置了一個'assert(!isEmpty());'。 –

回答

1

是否有方法可以指定C++中拋出某個方法的異常呢,還是僅僅是Java的東西?

是的,這是一個java的東西,在任何C++程序中都是非常不受歡迎的。如果該函數可以拋出異常,那麼將異常說明留空。如果不能,使用noexcept(> = C++ 11)或throw()(< C++ 11)

此外,你可以幫助自己很多來自要麼std::runtime_errorstd::logic_error獲得任何用戶異常(或任何的其他標準錯誤)。

例如

#include <stdexcept> 

// this is literally all you need. 
struct EmptyHeap : std::logic_error { 
    // inherit constructor with custom message 
    using logic_error::logic_error; 

    // provide default constructor 
    EmptyHeap() : logic_error("The heap is empty") {} 
}; 

現在扔​​與任一:

throw EmptyHeap(); 

或與自定義消息:

throw EmptyHeap("the heap is really empty"); 
+1

「Java事物」被稱爲「檢查異常」,實際上在很好的Java代碼中也很少見。請參閱Joshua Bloch的Effective Java書中的第41項(「避免不必要地使用已檢查的異常」)。 –

+0

這幾乎證實了我對老師來自Java背景的懷疑,我正在與之合作的學生繼續向我介紹這些不喜歡C++作業的C++作業。 –

+0

@JosephSchmidt對學生來說是一種可怕的恥辱。 –