Должен ли я создать объект исключения в инициализаторе или кодировать его в каждом методе? - PullRequest
0 голосов
/ 23 декабря 2011

В моих классах обслуживания я создаю экземпляр исключения, подобный этому:

protected ServiceException _ex;

protected void Initialize()
{
    _ex = new ServiceException();
}

Позже в этих классах я вызываю это исключение, если что-то идет не так:

    public void Delete<T, V>(T item, V repo)
        where T : Microsoft.WindowsAzure.StorageClient.TableServiceEntity
        where V : IAzureTable<T>
    {
        try
        {
            repo.Delete(item);
        }
        catch (Exception ex)
        {
            _ex.Errors.Add("", "Error when deleting " + typeof(T).Name.ToLower());
            throw _ex;
        }
    }

Вне этого вконтроллер, который я проверяю для исключения:

    catch (Exception e) { log(e); }

Затем я обрабатываю это:

    protected void log(Exception ex)
    {
        if (ex is ServiceException)
        {
            ModelState.Merge(((ServiceException)ex).Errors);  
        }
        else
        {
            Trace.Write(ex);
            ModelState.AddModelError("", "Database access error: " + ex.Message);
        }
    }

Извините за длинный пример, но я хотел бы знать, является ли это действительной вещьюдля меня, чтобы делать.В частности, кто-то заметил, что я создаю новое значение _ex каждый раз, даже если нет исключений.Моя причина была в том, что каждый контроллер имеет около двадцати блоков try-catch, и я подумал, что лучше просто создать объект _ex в начале, и поэтому мне не нужно иметь двадцать областей, где я создаю новый _ex, если что-то пойдет не так.Буду признателен, если кто-нибудь скажет мне, имеет ли это смысл.Спасибо.

Ответы [ 3 ]

1 голос
/ 23 декабря 2011

Исключение на самом деле не является частью постоянного внутреннего состояния класса, оно ничего не описывает в классе, на самом деле не помогает классу делать то, что ему нужно, это просто плохой побочный эффект, который может произойти, пока класс выполняет свою обычную функцию. Для этого ему не нужно находиться в удержанном состоянии класса. Просто создайте его, когда вам это нужно.

Что касается вашего беспокойства о возможности создания этого в 20 разных местах, возможно, это должно привести вас к вопросу, почему у класса есть 20 разных вещей, которые он делает. Все эти вещи логически связаны? Или ваш класс действительно представляет собой коллекцию многих классов, которые просто не были объявлены как таковые?

(При этом, если способ создания исключения является обычным в каждом случае, вы, безусловно, можете преобразовать создание в собственный метод / класс многократного использования.)

1 голос
/ 23 декабря 2011

Я бы этого не делал:

  • если (когда) вы начнете использовать несколько потоков, это станет довольно уродливым, когда 2 исключения произойдут примерно в одно и то же время.
  • когда 2 исключения происходят последовательно, как вы ожидаете очистки? Предполагается, что каждое место, где вы обрабатываете исключение, выполняет свою собственную очистку?
  • Что если удержать исключение и добавить дополнительную информацию или заменить ее единственным экземпляром, прежде чем можно будет его обработать?

Подобный подход используется в Win32 API (SetLastError) и в некоторых библиотеках времени выполнения (т. Е. errno в C). На мой взгляд, это затрудняет обработку ошибок.

Рекомендация - если вы хотите дать звонящему больше информации об ошибках - соберите информацию во время операции и сообщите об этом во вновь созданном исключении. Обратите внимание, что «операция» может означать несколько обращений к службе, но вызывающая сторона по-прежнему считает это одним действием. То есть OpenFile, WriteData, CloseFile могут быть закодированы одной операцией вызывающей стороной, также может быть лучше переопределить каждую операцию для одного вызова.

1 голос
/ 23 декабря 2011

Я бы предложил собирать ошибки в отдельной структуре, а затем просто передавать ее в конструктор класса исключений во время броска, чтобы вы не создавали экземпляр класса исключений, если это действительно не нужно:Можете ли вы привести несколько примеров, когда вы отслеживаете ошибку, но не вызываете исключение?

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