Это эффективный способ отловить и обработать исключения / ошибки? - PullRequest
1 голос
/ 24 декабря 2011

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

 ...
            if (pk == null || rk == null) return null;
            try
            {
                var item = repo.GetPkRk(pk, rk);
                return (T)item;
            }
            catch (Exception ex)
            {
                throw new ServiceException("", typeof(T).Name + rk + " data retrieval error");
            }
  ...

Класс ServiceException:

public class ServiceException : ApplicationException {     
        public Dictionary<string, string> Errors { get; set; }
        public ServiceException() : this(null) {}enter code here
        public ServiceException(string key, string message)
        {
            Errors = new Dictionary<string, string>(); 
            Errors.Add(key, message);
        }
        public ServiceException(Exception ex)
            : base("Service Exception", ex)
        {
            Errors = new Dictionary<string, string>();
        }
    }

Сообщение об ошибке попало в мой контроллер:

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);
            }
        }

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

Обновление 1

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

Обновление 2

Приведенный ниже код завершается с сообщением о том, что

Error   2   Property or indexer 'System.Exception.InnerException' cannot be assigned to -- it is read only

Я не уверен, как это исправить.

public class ServiceException : ApplicationException {

    public Dictionary<string, string> Errors { get; set; }
    public ServiceException() : this(null) {}
    public ServiceException(Exception ex, string key, string message)
    {
        Errors = new Dictionary<string, string>();
        InnerException = ex;
        Errors.Add(key, message);
    }
    public ServiceException(string key, string message)
    {
        Errors = new Dictionary<string, string>(); 
        Errors.Add(key, message);
    }
    public ServiceException(Exception ex)
        : base("Service Exception", ex)
    {
        Errors = new Dictionary<string, string>();
    }
}

Ответы [ 2 ]

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

Почти во всех случаях вы не должны ловить исключения вообще.

Вы должны ловить только те исключения, с которыми можно что-то делать.

Пожалуйста, посмотрите множество отличных вопросов по тегу : https://stackoverflow.com/questions/tagged/exception-handling?sort=votes.

Кроме того, обязательно ознакомьтесь с рекомендациями Microsoft по этому вопросу: « Руководство по проектированию исключений ».

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

В первую очередь

Включить перехваченное исключение в качестве внутреннего исключения

Так что вместо

throw new ServiceException("", typeof(T).Name + rk + " data retrieval error");

Вы должны установить внутреннее исключение. Измени свой конструктор

public ServiceException(string key, string message, Exception innerException)
            :base(message, innerException)
        {
            Errors = new Dictionary<string, string>(); 
            Errors.Add(key, message);
        }

Теперь

//form  your exception message
 var message = typeof(T).Name + rk + " data retrieval error";
//create service exception with the new overloaded constructor
 var exception  = new ServiceException("", typeof(T).Name + rk + " data retrieval error", message);
 throw exception;

Это сохранит ваше внутреннее исключение.

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