C ++ рдХреЙрд▓рдмреИрдХ рдФрд░ рдЕрдкрд╡рд╛рдж

рдкрд░рд┐рдЪрдп



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХрдИ рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрд╕рдПрдПрдХреНрд╕ рдореЙрдбрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рд╛рд╕реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рджреНрд╡рд╛рд░рд╛ред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЙрд▓ рдкрд░ рдХрд╕реНрдЯрдо рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдпрд╛ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рддрдХ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХрд╛ рдХреЛрдИ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рд╕реА ++ рдореИрджрд╛рди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред





рддреЛ, C ++ рдХреЛрдб рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП C рдХреЛрдб рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдЯреИрдХ рдХреЛ рдирд╖реНрдЯ рдХрд░рддреЗ рд╣реБрдП рдЖрдЧреЗ рдмрдврд╝ рдЬрд╛рдПрдЧрд╛ред

рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди, рд╡рд╣ рдЬреЛ рдореБрдЭреЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдорд┐рд▓рд╛ рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝ рджреЗрдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╣рдорд╛рд░рд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИред



рдорд╛рдорд▓рд╛



рдореИрдВрдиреЗ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдкреИрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ред рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдареАрдХ-рдареАрдХ рдЙрддреНрдкрдиреНрди рд╣реБрдИред рдХрд╛рд░реНрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛:





рдореИрдВрдиреЗ рдПрдХреНрд╕рдкреИрдХреНрдЯрд░ рдХреЗ рдКрдкрд░ рдПрдХ рд░реИрдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдиреЗ рдкрд┐рдЫрд▓реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рджреЛрд╣рд░рд╛рдпрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдерд╛ рдХрд┐ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкреИрджрд╛ рд╣реБрдЖ рдерд╛ред



рд╡рд┐рдЪрд╛рд░



рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди C ++ рдХреЛрдб рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЕрдкрд╡рд╛рдж рдХреЛ рдмрдЪрд╛рдирд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реНрдерд╛рди рдкрд░ рдлреЗрдВрдХрдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЬреБрдбрд╝реА рдХрдИ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд╣реИрдВред



рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди



рдХрдХреНрд╖рд╛ рдЕрдкрд╡рд╛рдж_рд╕реНрдЯреЛрд░



рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рднрдВрдбрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рд▓рдЧреЗрдЧрд╛:

class exception_storage

{

public :

inline ~exception_storage() {}

inline exception_storage() {}



void rethrow() const ;



inline void store(clone_base const & exc);

inline bool thrown() const ;

private :

std::auto_ptr< const clone_base> storedExc_;

};









Clone_base рд╡рд░реНрдЧ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдирд╛ рд╣реИ :: рдЕрдкрд╡рд╛рдж_detail :: clone_base рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ:



inline

void exception_storage::store(clone_base const & exc)

{

storedExc_.reset(exc.clone());

}

inline

bool exception_storage::thrown() const

{

return storedExc_.get() != 0;

}

inline

void
exception_storage::rethrow()

{

class exception_releaser

{

public :

inline

exception_releaser(std::auto_ptr< const clone_base> & excRef)

: excRef_(excRef)

{}

inline

~exception_releaser()

{

excRef_.reset();

}

private :

std::auto_ptr< const clone_base> & excRef_;

};



if (thrown())

{

volatile exception_releaser dummy(storedExc_);

storedExc_->rethrow();

}

}









рддреАрди рддрд░реАрдХреЗ, рд╕реНрдЯреЛрд░ - clone_base :: рдХреНрд▓реЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрддрдорд╛рди рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ :: рдХреНрд▓реЛрди, рдЕрдВрддрд┐рдо рдЕрдкрд╡рд╛рдж рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рд╣реБрдЖ, рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ - рдХреНрдпрд╛ рдЕрдкрд╡рд╛рдж рдмрд┐рд▓реНрдХреБрд▓ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдлрд╝рдВрдХреНрд╢рди clone_base :: рдХреНрд▓реЛрди рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЖрднрд╛рд╕реА рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдкрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИ :: enable_current_exception, рдЬреЛ рдПрдХ рдкрддреНрдерд░ рд╕реЗ рджреЛ рдкрдХреНрд╖рд┐рдпреЛрдВ рдХреЛ рдорд╛рд░рддрд╛ рд╣реИ: рдпрд╣ рдкреНрд░рддреНрдпрдХреНрд╖ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдЬрд╛рдирдиреЗ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрдореВрд░реНрдд clone_base рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреАрдЫреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВред ред

рдореИрдВ рд░реЗрдереНрд░реЛ рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди рд░реАрдереНрд░реЛ рдХреЛ рдЗрд╕рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдпрд╣ рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ)ред рдЬрдм рдЗрд╕реЗ рдлреЗрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдкрд╡рд╛рдж_releaser рд╡рд░реНрдЧ рд╕рдВрдЧреНрд░рд╣реАрдд рдЕрдкрд╡рд╛рдж рдХреА рдореЗрдореЛрд░реА рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддрд╛ рд╣реИред рдкреАрдврд╝реА рдХреЗ рджреМрд░рд╛рди рдЕрдкрд╡рд╛рдж рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП storeExc_ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдиреЗ рдореБрдЭреЗ рдкреАрдврд╝реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд┐рдпрди рдзреНрд╡рдЬ рдкрд░ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред



рдЕрдкрд╡рд╛рдж рдлрд╝рд┐рд▓реНрдЯрд░



рдЗрд╕ рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рдмрд╛рдд, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЕрдкрд╡рд╛рдж рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реИред рдЕрджреНрднреБрдд рдмрдврд╝рд╛рд╡рд╛ :: mpl рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдмрд╣реБрдд рдорджрдж рдХрд░реЗрдЧрд╛ред рдЖрдЗрдП рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред



рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╡рд╛рдж рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдкрдХрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдХреЙрд▓рдмреИрдХ рд▓реЗрдВ:



void callback( void *userData, char const *libText);









рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджрд╛рдпрд░реЗ рдХреЗ рдмрд╛рд╣рд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдХреИрд╕реЗ рд░реЛрдХрд╛ рдЬрд╛рдП?

рдкрд╣рд▓рд╛ рдЙрдкрд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдЪреАрдЬ рдХреЛ рд░реЛрдХрдирд╛ред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд╣рдо рднрд╛рд╖рд╛ рдХреЗ рдПрдХ рдХрд╖реНрдЯрдкреНрд░рдж рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдЖрдк рдПрдХ рдкреЛрд░реНрдЯреЗрдмрд▓ рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рдкрдХрдбрд╝рдиреЗ (...) рдмреНрд▓реЙрдХ рдореЗрдВ рдЕрдкрд╡рд╛рдж рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрд╣ рддрдм рдерд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рдХрд┐ рд╣рдо рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрди рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдХреНрдпрд╛ рдЕрдкрд╡рд╛рдж рдкрдХрдбрд╝реЗ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред

рдореИрдВрдиреЗ рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдЕрдкрд╡рд╛рдж рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



template < typename List, size_t i = boost::mpl::size<List>::value - 1>

class exception_filter

{

typedef typename boost::mpl::at_c<List, i>::type exception_type;

public :

static inline void try_(exception_storage & storage)

{

try

{

exception_filter<List, i - 1>::try_(storage);

}

catch (exception_type const & e)

{

storage.store(boost::enable_current_exception(e));

}

}

};

template < typename List>

class exception_filter<List, 0>

{

typedef typename boost::mpl::at_c<List, 0>::type exception_type;

public :

static inline void try_(exception_storage & storage)

{

try

{

throw ;

}

catch (exception_type const & e)

{

storage.store(boost::enable_current_exception(e));

}

}

};









рдпрд╣ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рддреНрд╡рд░рд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ рдЬреЛ рд╕реВрдЪреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдврд╝рд╛рд╡рд╛ :: mpl :: рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡реЗрдХреНрдЯрд░ рдореЗрдВ, рдЖрдк рдЙрди рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬрдм рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдлреИрд▓рддрд╛ рд╣реИ (рдЫрджреНрдордХреЛрд╢):



try

{

try

{

try

{

throw ;

}

catch (exception_type_1)

{

}

}

catch (exception_type_2)

{

}

}

catch (exception_type_N)

{

}









рдЬрд╣рд╛рдБ N, mpl :: рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред

рдпрджрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдЕрдкрд╡рд╛рдж рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдкрд╡рд╛рдж_рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ :: enable_current_exceptionред Smart_filter рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреНрдп рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк рд╕реВрдЪреА рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдереЗред



template <typename List>

inline void smart_filter(exception_storage & storage)

{

try

{

exception_filter<List>::try_(storage);

}

catch (...)

{

storage.store(boost::enable_current_exception(std::runtime_error("unexpected")));

}

}









рдкрд░рд┐рдгрд╛рдо



рдЕрдм рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдКрдкрд░ рдПрдХ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЗрд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рд╡рд┐рдЪрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдпреЛрдЬрдирд╛рдмрджреНрдз рддрд░реАрдХреЗ рд╕реЗ рджрд┐рдЦрд╛рдКрдВрдЧрд╛:



template < typename List>

class MyLib

{

public :

MyLib()

{

pureCLibRegisterCallback(&MyLib::callback);

pureCLibSetUserData( this );

}

virtual void doIt()

{

pureCLibDoIt();

storage_.rethrow();

}

protected :

virtual void callback( char const *) = 0;

private :

static void callback( void * userData, char const * libText)

{

if (MyLib<List> * this_ = static_cast <MyLib<List>*>(userData))

{

try

{

this_->callback(libText);

}

catch (...)

{

smart_filter<List>(this_->storage_);

}

}

}

exception_storage storage_;

};









рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЕрдм рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред



struct MyClass

: public MyLib <

boost::mpl::vector

<

std::runtime_error,

std::logic_error,

std::exception

>

>

{

private :

void callback( char const * text)

{

throw std::runtime_error(text);

}

};

int main()

{

MyClass my;



try

{

my.doIt();

}

catch (std::exception const & e)

{

std::cout << e.what() << std::endl;

}

return 0;

}









рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдкрд░рд┐рд╡реЗрд╢ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИред






All Articles