Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
A function-try block catches exceptions generated from a call made in a constructor's initialization list.
Example
The following example uses a function-try block:
// NVC_Function_Try.cpp
// Compile by using /EHsc
#include <iostream>
#include <ostream>
#include <stdexcept>
#include <string>
using namespace std;
class Name
{
public:
Name(const string& strFirstName, const string& strLastName)
{
if(strFirstName == "")
{
throw runtime_error("Error in Name::Name(): first name parameter must not be blank.");
}
if(strLastName == "")
{
throw runtime_error("Error in Name::Name(): last name parameter must not be blank.");
}
m_firstName = strFirstName;
m_lastName = strLastName;
cout << "Inside Name::Name(): My name is " << GetName() << "." << endl;
}
~Name()
{
cout << "Inside Name::~Name(): Destroying " << GetName() << "." << endl;
}
string GetName()
{
return m_firstName + " " + m_lastName;
}
private:
string m_firstName;
string m_lastName;
};
class Person
{
public:
Person(const string& strFirstName, const string& strLastName)
// begin function-try block
try : m_name(strFirstName, strLastName){}
catch (const runtime_error& err)
{
cout << "Caught exception inside Person::Person()." << endl;
cout << err.what() << endl;
// The exception will be automatically rethrown.
}
~Person()
{
cout << "Inside Person::~Person(): Destroying " << m_name.GetName() << "." << endl;
}
private:
Name m_name;
};
int main()
{
try
{
// Test 1 - Valid Parameters
{
cout << "Attempting to construct an object of class Person." << endl;
cout << "Passing parameters: \"John\", \"Smith\"" << endl;
Person person1("John", "Smith");
}
cout << "Test 1 completed." << endl;
// Test 2 - Invalid first name parameter
{
// Note that an exception will be thrown in Name's constructor,
// as the first name parameter must not be blank.
// Because this exception is thrown, person2's destructor
// is never called.
cout << "Attempting to construct an object of class Person." << endl;
cout << "Passing parameters: \"\", \"Jones\"" << endl;
Person person2("", "Jones");
}
}
catch (const runtime_error&)
{
cout << "Exception caught within main()." << endl;
}
}
// Output:
// --------------------------
// Attempting to construct an object of class Person.
// Passing parameters: "John", "Smith"
// Inside Name::Name(): My name is John Smith.
// Inside Person::~Person(): Destroying John Smith.
// Inside Name::~Name(): Destroying John Smith.
// Test 1 completed.
// Attempting to construct an object of class Person.
// Passing parameters: "", "Jones"
// Caught exception inside Person::Person().
// Error in Name::Name(): first name parameter must not be blank.
// Exception caught within main().