Я сейчас использую следующий код для перехвата ошибок и выдачи исключений в моем слое обслуживания:
...
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>();
}
}