Вложите вызванную исключительную ситуацию наконец блок

Существует ли путь, как получить в настоящее время вызванную исключительную ситуацию (если существует)?

Я хотел бы, уменьшают объем кода и применяются, некоторое повторное использование для задачи похоже:

Exception thrownException = null;
try {
    // some code with 3rd party classes, which can throw unexpected exceptions
}
catch( Exception exc ) {
    thrownException = exc;
    LogException( exc );
}
finally {
    if ( null == thrownException ) {
        // some code
    }
    else {
        // some code
    }
}

и замените его этим кодом:

using( ExceptionHelper.LogException() ) {
    // some code with 3rd party classes, which can throw unexpected exceptions
}
using( new ExceptionHelper { ExceptionAction = ()=> /*some cleaning code*/ } ) {
    // some code with 3rd party classes, which can throw unexpected exceptions
}

public class ExceptiohHelper : IDisposable {
    public static ExceptionHelper LogException() {
        return new ExceptionHelper();
    }

    public Action SuccessfulAction {get; set;}
    public Action ExceptionAction {get; set;}

    public void Dispose() {
        Action action;
        Exception thrownException = TheMethodIDontKnow();
        if ( null != thrownException ) {
            LogException( thrownException );
            action = this.ExceptionAction;
        }
        else {
            action = this.SuccessfulAction;
        }

        if ( null != action ) {
            action();
        }
    }
}

Действительно ли этот сценарий возможен?

Спасибо

6
задан TcKs 14 January 2010 в 08:37
поделиться

3 ответа

Что ты думаешь о следующем. Вместо того, чтобы смотреть на проблему как, "Как получить последнее исключение?", что, если вы изменяете его на, "Как я выполняю некоторую часть кода еще с некоторым управлением?"

, Например: Вместо ExceptionHelper у вас мог быть ActionRunner.

public class ActionRunner
{
    public Action AttemptAction { get; set; }
    public Action SuccessfulAction { get; set; }
    public Action ExceptionAction { get; set; }

    public void RunAction()
    {
        try
        {
            AttemptAction();
            SuccessfulAction();
        }
        catch (Exception ex)
        {
            LogException(ex);
            ExceptionAction();
        }
    }

    private void LogException(Exception thrownException) { /* log here... */ }
}

Это, по крайней мере, дало бы вам некоторое повторное использование SuccessfulAction и ExceptionAction, предполагающего, что только AttemptAction варьируется между вызовами.

var actionRunner = new ActionRunner
{
    AttemptAction = () =>
    {
        Console.WriteLine("Going to throw...");
        throw new Exception("Just throwing");
    },
    ExceptionAction = () => Console.WriteLine("ExceptionAction"),
    SuccessfulAction = () => Console.WriteLine("SuccessfulAction"),
};
actionRunner.RunAction();

actionRunner.AttemptAction = () => Console.WriteLine("Running some other code...");
actionRunner.RunAction();
4
ответ дан 8 December 2019 в 16:03
поделиться

Оставить «заднюю дверь», которая позволяет другому классу друзей/функции построить объект способом, запрещенным для пользователя. В качестве примера можно привести контейнер, создающий итератор (C++):

Iterator Container::begin() { return Iterator(this->beginPtr_); }
// Iterator(pointer_type p) constructor is private,
//     and Container is a friend of Iterator.
-121--2031702-

Может быть не полезен в данный момент, но .Net 4 имеет класс SortedSet в BCL.

-121--3677837-

Если вы хотите найти неожиданные исключения, вы должны обработать UnhandLedException . Вы должны ловить исключения только на более низких уровнях, которые вы намерены обрабатывать (не только для регистрации), в противном случае вы должны позволить им пузырь вверх и быть пойманы на более высоком уровне, или, как я упоминал ранее в методе UnhandledException.

3
ответ дан 8 December 2019 в 16:03
поделиться

Идея в том, что вы обрабатываете исключения в блоке catch...

Тем не менее, Exception - это ссылочный тип, так что вы всегда можете объявить переменную Exception вне области видимости try...

Exception dontDoThis;
try
{
    foo.DoSomething();
}
catch(Exception e)
{
    dontDoThis = e;
}
finally
{
    // use dontDoThis...
}
8
ответ дан 8 December 2019 в 16:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: