Ведение журнала в объекте исключения - PullRequest
0 голосов
/ 01 августа 2010

В настоящее время у меня есть этот класс, который закодировал другой программист в моей команде:

public static class SoapExecuter
{
    private static readonly ILog logger;

    public static Exception ExecuterException { get; private set; }

    public static bool IsSoapException
    {
        get 
        {
            if (ExecuterException == null)
                return false;

            return ExecuterException.GetType() == typeof(SoapException);
        }
    }

    public static bool Execute(Action action)
    {
        ExecuterException = null;
        bool passed = false;

        try
        {
            action();
            passed = true;
        }
        catch (SoapException se)
        {
            ExecuterException = se;
            logger.log(se);
        }
        catch (Exception ex)
        {
            ExecuterException = ex;  
            logger.log(ex);
        }

        return passed;
    }
}

Это не очень идиоматично, и я хотел бы изменить его на то, что происходит в предложении try ... catch.
Есть ли способ не нарушать DRY и при этом оставаться в рамках идиом, предлагаемых языком?
Конечно, я могу наследовать от SoapException и регистрировать его, но мне придется ловить SoapException и создавать новый объект исключенияэто оборачивает это и затем бросает это, чтобы быть заставленным замолчать на один уровень выше.
Любая идея, ребята?

1 Ответ

1 голос
/ 01 августа 2010

Звучит так, будто вы действительно не хотите обрабатывать это исключение внутри Execute. Кажется, что ответственность за обработку исключения лежит на коде, который вызывает Execute.

Конечно, вы все еще можете поймать его, сохранить в ExecuterException, зарегистрировать его, а затем повторно выбросить, используя throw; - но цель ExecuterException ускользает от меня. Похоже, он нужен вам только для IsSoapException, который, в свою очередь, намного лучше записывается как ExecuterException is SoapException, что даже заботится о пустоте и подклассах.

Я не думаю, что кто-либо может оказать какую-либо дополнительную помощь, кроме этой, не увидев код, который использует код, который вы опубликовали. Если этот код запрашивает ExecuterException только сразу после вызова Execute, то вы можете (и должны), вероятно, просто изменить его на try / catch в этом коде. Если он на самом деле запрашивает ExecuterException в другом месте, то вы могли бы подумать о том, чтобы этот код сохранял ссылку вместо этого, но в любом случае это означало бы, что код довольно запутанный спагетти-код и, вероятно, в любом случае требует его переписывания.

(Кстати, просто чтобы придираться, первое из двух предложений catch в вашем коде полностью избыточно. Если вы удалите его, вы получите точно такое же поведение - если только logger.log не имеет специальной перегрузки для SoapException, но тогда вам, вероятно, тоже придется это реструктурировать.)

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