c # - объединить 2 оператора в блоке catch в один - PullRequest
1 голос
/ 15 декабря 2009

Кто-нибудь знает, возможно ли написать код в блоке catch ниже как один оператор? Я не смог придумать способ, и мне было просто любопытно, если он был.

ВАЖНО: трассировка стека должна быть сохранена.

    catch (Exception e)
    {
        if (e is MyCustomException)
        {
            // throw original exception
            throw;
        }

        // create custom exception
        MyCustomException e2 =
            new MyCustomException(
                "An error occurred performing the calculation.", e);
        throw e2;
    }

Ответы [ 5 ]

15 голосов
/ 15 декабря 2009

А как же:

catch (MyCustomException)
{
   throw;
}
catch (Exception ex)
{
   throw new MyCustomException(ex);
}
2 голосов
/ 15 декабря 2009
catch (Exception e)
{
   if (e is MyCustomException) throw;

   throw new MyCustomException("An error occurred performing the calculation.", e);
}

Я думаю, что это примерно так кратко, я думаю.

Это немедленно подбрасывает MyCustomException вверх по стеку (что вы и делаете с throw; в своем вопросе), в то время как выбрасывает MyCustomException, чтобы обернуть другие Exception типы, встречающиеся при исполнении.

Кроме того, вы можете просто сделать:

catch (Exception e)
{
   throw new MyCustomException("An error occurred performing the calculation.", e);
}

и в случае, когда MyCustomException был пойман, у вас будет MyCustomException в e.InnerException, где e a MyCustomException на следующем уровне стека ИЛИ у вас будет System.Exception в случаях, когда MyCustomException это не то, что было поймано.

0 голосов
/ 15 декабря 2009

Будет ли это работать?

        catch (Exception e)
        {
            throw e.GetType() == typeof(MyCustomException) ? e : new MyCustomException("An error occurred performing the calculation.", e);
        }
0 голосов
/ 15 декабря 2009

Это действительно возможно.

Однако трассировка стека будет содержать дополнительные записи:

public static class ExceptionHelper
{
    public static void Wrap<TException>(Action action, Func<Exception, TException> exceptionCallback)
        where TException : Exception
    {
        try
        {
            action();
        }
        catch (TException)
        {
            throw;
        }
        catch (Exception ex)
        {
            throw exceptionCallback(ex);
        }
    }
}
//Usage:
ExceptionHelper.Wrap(() => this.Foo(), inner => new MyCustomException("Message", inner));
0 голосов
/ 15 декабря 2009

Я знаю, что это не отвечает на ваш первоначальный вопрос, однако стоит отметить, что вы должны быть осторожны при использовании throw - хотя в милях лучше, чем throw ex, могут существовать обстоятельства, когда использование throw не дает сохранить трассировку стека. См:

http://weblogs.asp.net/fmarguerie/archive/2008/01/02/rethrowing-exceptions-and-preserving-the-full-call-stack-trace.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...