Eric Lilja wrote:
> Hello, in my program I have a function (pseudo code):
>
> void start_mysql_service()
> {
> obtain handle
>
> start mysql service using handle
>
> if start fails close handle and throw an exception containing error
> description
>
> else just close handle and return
> }
>
> So no matter if the service is successfully started or not, the handle needs
> to be closed to prevent leakage. But the function that closes the handle may
> also throw. How should I handle that? catch the close-handle-exception in
> start_mysql_service()? Right now I don't catch anything in the
> start_mysql_service() function so if it fails to start the service it
> prepares to throw an exception, that exception never gets thrown if it the
> close handle functions throws. I don't want one error hiding another one.
> The real code looks like this and it's ugly (and contains some platform
> specific material, sorry about that):
Use nested try catch blocks
> void
> start_mysql_service()
> {
> /* May throw an exception. */
> SC_HANDLE mysql_service = get_mysql_service_handle();
>
> if(!StartService(mysql_service, 0, NULL))
> {
> /* May throw an exception and if it does I never get to throw */
> /* the exception indicating that StartService() failed. */
try
{
> close_service_handle(mysql_service);
}
catch (...)
{
// we don't care about this exception, we want
// to say what that StartService failed, so we
// catch and ignore it.
}
>
// note: this TODO should probably go before the call to
// call to close_service_handle(), so that any error in c_s_h()
// doesn't mask the results from StartService()
> /* TODO: Obtain more precise cause of error if possible using
> GetLastError() and FormatMessage(). */
> throw runtime_error("StartService() failed.");
> }
>
> /* May throw an exception. */
> close_service_handle(mysql_service);
> }
>
>
> Any ideas how to restructure this into nicer-looking code and solving the
> problem of one error hiding another one?
>
> / E
>
>
|