Усиливает ли упаковка и реконструирует исключение?

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

Что не так с моим подходом? Есть ли у кого-нибудь предложения о том, как я могу регистрировать и обрабатывать исключение здесь?

public class BusinessRepository : IBusinessRepo
{
    public List<Employee> GetEmployees()
    {
        try
        {
            //do some DB operations
        }
        catch (SQLException sqlex)
        {
            Logger.Log("Exception detail with full stack trace");
            throw new DALException(sqlex, "Error in data access layer");
        }

    }
}
public class BusinessLayerClass : IBusinessLayer
{
    private readonly IBusinessRepo Repo;
    public BusinessLayerClass(IBusinessRepo rep)
    {
        Repo = rep;
    }
    public List<Employee> GetEmployees()
    {
        try
        {
           List<Employee> emps= return Repo.GetEmployees();
        }
        catch (DALException dex)
        {
            //do nothin as it got already logged
            throw;
        }
        catch (Exception ex)
        {
            Logger.Log(ex, "Business layer ex");
            throw new BusinessLayerEx(ex);
        }
    }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        try
        {
            List < Employee >= BusinessLayerClass.GetEmployees();

        }
        catch (DALException)
        {
            //show error msg to user
        }
        catch (BusinessLayerEx)
        {
            //show error msg to user
        }
        catch (Exception ex)
        {
            Logger.Log();
            //show error msg to user
        }
        return View(emps);
    }
 }

Правильно ли я следую правильному пути барботирования и обработки и регистрации?

Ответ 1

Я склонен согласиться с вашим способом сделать это, если соблюдены два условия:

  • Ваши операторы Logger.Log записывают что-то более содержательное/полезное, чем то, что вы указали здесь (я предполагаю, что ваш код здесь просто пример сообщения, указывающего, что ошибка регистрируется). Если он предоставляет информацию, которую вы можете использовать для отслеживания причины исключения, хорошо.
  • Ваши комментарии //show error msg to user означают, что в этом месте вы визуализируете приятный вид, объясняющий, что произошла ошибка, и вы не просто показываете трассировку экрана/трассировку по умолчанию.

Что касается вашего throw;, когда вы поймаете DALException, вы просто бросили: это прекрасно. Кажется, ваша цель состоит в том, чтобы поймать любое исключение, выходящее из предыдущего слоя, и занести его в журнал, а затем выбросить свое собственное исключение. Поскольку DALException будет выведено, только если вы уже зарегистрировали другую ошибку и бросили ее сами, это совершенно нормально, чтобы позволить этому пузыриться выше этого уровня.

Ответ 2

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

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

Ответ 3

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

Обработка исключений может быть довольно сложной технически. В конце концов, большую часть времени мы их точно не ожидаем. Но то, что может сделать почти невозможным для обработки исключений "правильным", - это то, что команда или проект просто не имеют стратегии для обработки ошибок. В идеальном мире мы с самого начала знали бы, с какими условиями ошибок нам нужно справляться, и мы разработали все приложение с учетом этих соображений (наряду с другими ограничениями, которые нам также необходимо иметь в виду, от читаемости кода до производительности).

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

Ответ 4

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

Что касается производительности, это не имеет большого значения, потому что что-то очень плохое уже произошло.