Дилемма обработки исключений - PullRequest
2 голосов
/ 12 января 2010

Работая над существующим кодом, я недавно обнаружил, что smt выглядит так:

if(Config.ExceptionBehavior.DEBUG_EXCEPTIONS)
{
   foo.Foo();
}
else
{
   try
   {
      foo.Foo();
   }
   catch(Exception ex)
   {
      //whatever
   }
}

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

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

Единственная альтернатива, о которой я могу подумать, - это набор #if DEBUG и т. Д., Но мне интересно, есть ли какая-нибудь библиотека приложений, обрабатывающая исключения, которая может дать мне что-то вроде этого.

Любые указатели приветствуются!

Ответы [ 3 ]

2 голосов
/ 12 января 2010

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

Вот как.

  1. Перейти в Debug-> Исключения
  2. Установите флажок в столбце «Брошенный» для «Общих исключений времени выполнения»
  3. При желании, если вы хотите более точный контроль над тем, какие исключения следует останавливать, не устанавливайте флажок «Общие исключения времени выполнения языка», а вместо этого разверните этот узел и отметьте те, на которых вы хотите остановиться.

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

0 голосов
/ 05 февраля 2010

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

Пример в веб-части ASP.NET:

   protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        try
        {
            DoSomethingDangerous();
        }
        #if !DEBUG
        catch (Exception ex)
        {
            Utilities.HandleException(ex); // does logging & shows a pretty error msg
        }
        #endif
        finally
        {
        }
    }
0 голосов
/ 12 января 2010

Вы можете достичь того же, используя класс ActionPredicate).

public void TryIt(Action action){
    if(Config.ExceptionBehavior.DEBUG_EXCEPTIONS){
        action.Invoke();
    }else{
        try{
            action.Invoke();
        }catch{
            //whatever
        }
    }
}

public void MyMethod(string s){
   //Do something
}

public void MyOtherMethod(){
   //Do something entirely different
}

//Somewhere else in code:
TryIt(() => MyMethod("somestring"));
TryIt(MyOtherMethod);

Существуют также общие версии, которые позволяют вам возвращать данные из метода TryIt. Пожалуйста, дайте мне знать, если вам нужны указатели в этом направлении.

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