2016-12-02 1 views
0

Ich habe über 20 Versuche versucht & zahlreiche Seiten für die letzten 2 Stunden abgelesen und kann nicht herausfinden, was ich falsch hier tun:C++ Klasse Funktion Geben Wirft Angepasste Exception

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

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

dann in der Heap-Klasse, eine öffentliche Methode:

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

Dieser Code funktioniert, aber der Original-Header war:

void remove() throw EmptyHeap; 

Gibt es eine Möglichkeit zu spezifizieren, welche Ausnahme eine Methode in C++ wirft, oder ist das nur eine Java-Sache?

+4

[Die korrekte Syntax] (http://en.cppreference.com/w/cpp/language/except_spec) ist 'throw (EmptyHeap)' (beachten Sie die Klammern). Beachten Sie außerdem, dass Ausnahmespezifikationen veraltet sind. Lass es einfach. –

+0

[C++ Ausnahme Spezifikation ersetzen] (http://stackoverflow.com/q/14609329/669576) –

+1

Beachten Sie, dass dies sehr wahrscheinlich keine Ausnahme überhaupt sein sollte. Wie würden Sie von einer "EmptyHeap" -Ausnahme "erholen"? Es ist ein Programmierfehler, um etwas aus einem leeren Heap zu entfernen, also wäre es richtig, eine Vorbedingung für 'isEmpty' hinzuzufügen. Das bedeutet, dass Sie die Vorbedingungen für Benutzer der Klasse dokumentieren und ein 'assert (! IsEmpty());' in den Code einfügen. –

Antwort

1

Gibt es eine Möglichkeit zu spezifizieren, welche Ausnahme eine Methode in C++ wirft, oder ist das nur eine Java-Sache?

Ja, es gibt, und ja, es ist eine Java-Sache, die in jedem C++ Programm extrem unerwünscht ist. Wenn die Funktion eine Ausnahme auslösen kann, lassen Sie die Ausnahmespezifikation leer. Wenn es darf nicht verwenden noexcept (> = C++ 11) oder throw() (< C++ 11)

Darüber hinaus können Sie sich selbst helfen, eine Menge von jedem Benutzer Ausnahme von Ableiten entweder std::runtime_error oder std::logic_error (oder jeden der anderen Standardfehler).

z.B.

#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") {} 
}; 

werfen nun entweder mit:

throw EmptyHeap(); 

oder mit einer benutzerdefinierten Nachricht:

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

Das "Java-Ding" heißt "checked exceptions" und tendiert dazu, auch in gutem Java-Code selten zu sein. Siehe Eintrag 41 in Joshua Blochs Effektivem Java-Buch ("Vermeiden Sie die unnötige Verwendung von geprüften Ausnahmen"). –

+0

Das bestätigt ziemlich genau meinen Verdacht, dass der Lehrer von einem Java-Hintergrund kommt, der Student, mit dem ich arbeite, kommt immer wieder mit diesen C++ - Zuweisungen zu mir, die sich nicht wie C++ - Zuweisungen anfühlen. –

+0

@JosephSchmidt das ist eine Schande für die Studenten. –

Verwandte Themen