ich Problem mit Ausnahmen haben:Ausnahmen & C-Strings
#include <iostream>
#include <cstring>
#include <exception>
class except :public std::exception
{
char* err;
public:
except(const char* s) noexcept
{
err = new char[strlen(s) + 1];
strcpy(err, s);
err[strlen(s)] = 0; //is it necessary??
}
virtual const char* what() noexcept
{return err;}
virtual ~except() noexcept
{delete err;}
};
double div(const double& a, const double& b) noexcept
{
if (b == 0.0)
throw except("DIVIDED BY 0");
return a/b;
}
int main()
{
try
{
std::cout << div(5.0, 0.0);
}
catch (std::exception &ex)
{
std::cout << ex.what();
}
return 0;
}
Ich will "Geteilt durch 0" drucken, aber ich bekomme:
terminate called after throwing an instance of 'except'
what(): std::exception
Aborted
Process returned 134 (0x86)
Soll ich noexcept
in jeder Funktion/member-Funktion, die keine Ausnahmen auslöst?
Ist err[strlen(s)] = 0
erforderlich? (In außer :: außer (const char * s))
Warum Sie std :: string nicht verwenden? Besser: Ableiten von std :: runtime_error. –
1) Weißt du, was C-Saiten sind? Sie sind nullterminierte Strings. "_Is' err [strlen (s)] = 0' notwendig? _ "Nein, nicht wirklich, seit [std :: strcpy] (http://en.cppreference.com/w/cpp/string/byte/strcpy) enthält es, wenn Sie die Zeichenfolge kopieren. Eine solche Linie verursacht jedoch keinen Schaden. 2) 'löschen err;' ist undefiniertes Verhalten. Es sollte gelöscht werden als 'delete [] err;', da es 'new'ed mit' new [] 'ist. –
Sie verwenden Ausnahmen, ein etwas mittleres bis fortgeschrittenes Thema in C++, aber Sie verwenden C-Style-Strings. Warum? – PaulMcKenzie