FAQ
for [no.it.programmering.c++]finally i C++?
C++ støtter ikke finally (angivelse av kode som skal
utføres enten et unntak oppstår eller ikke).
Der det ser ut som om du trenger finally kan du bruke en
eller flere av disse teknikkene:
std::auto_ptr-klassen.boost::shared_ptr-klassen.boost::shared_ptr kan brukes til mer generell
opprydding; du finner Boost-biblioteket på
[http://www.boost.org].ScopeGuard-klassen.ScopeGuard-klasse kan
brukes til opprydding der du ønsker “alt eller intet”; du finner
en artikkel om ScopeGuard på
[http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/],
og kildekode i
[ftp://ftp.cuj.com/pub/2000/cujdec2000.zip].finally.
Selv om det ikke er noen permanent løsning, absolutt ikke å anbefale, og
heller ikke støttet av alle C++ kompilatorer, her er et program som viser
hvordan du kan simulere finally:
#include <iostream> // std::cout, std::endl
#include <stdexcept> // std::runtime_error, std::exception
int answer( bool doFail )
{
struct Result{ int value; Result( int v ): value( v ) {} };
try
{
std::cout << "answer() called" << std::endl;
if( doFail )
{
throw std::runtime_error( "You told me to!" );
}
throw Result( 42 ); // Must 'throw', not 'return'.
}
catch( ... )
{
// Finally:
std::cout << "answer() returning" << std::endl;
// Exception propagation or normal return.
try
{
throw;
}
catch( Result const& aResult )
{
return aResult.value;
}
}
}
int main()
{
try
{
int const answer1 = answer( false ); // No-throwing.
std::cout << "Svaret er " << answer1 << "." << std::endl;
int const answer2 = answer( true ); // Throwing.
std::cout << "Svaret er " << answer2 << "." << std::endl;
}
catch( std::exception const& x )
{
std::cerr << "Failed because: " << x.what() << std::endl;
}
}
som gir (skal gi) utskriften
answer() called
answer() returning
Svaret er 42.
answer() called
answer() returning
Failed because: You told me to!