2010-12-12 6 views
9

Это вопрос о лучшей практике .net. Я всегда пойман и хранить информацию об исключениях во всех моих веб и оконных формах приложений следующим образом:Как обрабатывать исключения?

  1. окруженных каждый метод с попыткой поймать (Exception исключения)
  2. Для любого слоя, за исключением переднего слоя, выбросил исключение в слой выше
  3. На переднем слое зарегистрировано исключение из файла журнала (обычно с помощью log4config.dll) и предоставлено пользователю удобное для пользователя сообщение.

Это лучший способ справиться с исключениями? Или я должен делать что-то другое в моих следующих проектах?

+0

Что вы имеете в виду 1.Surrounded каждый метод с попытке поймать (исключение Exception) – Stilgar

+0

TRY {// сделать что-нибудь} поймать (исключение Exception) {// сделать что-то} – InfoLearner

ответ

2

Следующий код является проблематичным, поскольку он перезаписывает исходную трассировку стеки для e, что делает проблемы труднее диагностировать:

public void Foo() { 
    try { 
     Bar(); 
    } catch(Exception e) { 
     throw e; // re-throw; overwrites original stacktrace in 'e' 
    } 
} 

Следующий код не имеет выше StackTrace проблемы перезаписи, но по-прежнему излишне многословные :

public void Foo() { 
    try { 
     Bar(); 
    } catch(Exception e) { 
     throw; // re-throw; preserves original stacktrace in 'e' 
    } 
} 

Оба будут лучше написаны, как показано ниже. Это происходит потому, что если единственное, что вы делаете в вашем поймать блок повторно бросает исключение, нет необходимости писать крылатую блок на все:

public void Foo() { 
    Bar(); 
} 
+4

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

+0

Таким образом, доказывая, насколько легко для благонамеренного кода сделать что-то хуже :) –

+0

@Simon - хороший улов. Благодарю. Я обновил свой ответ. –

6

Я бы не добавить 1 & 2, если у меня не было какой-то конкретной причины; например, чтобы изменить (обернуть) сообщение; нет необходимости, поскольку в любом случае исключения будут подниматься вверх. И сделано неправильно, вы можете случайно удалить все важные трассировки стека (throw; vs throw ex; - первый из них предпочтителен).

-1

Вот как НЕ в обрабатывать исключения.

public void method1(){ 
    try{ 
     .... 
     // all the code goes here 
     // declare any helper methods throw throwable 
     // eg: private boolean check1() throws Throwable{ ...} 
     .... 
    }catch(Throwable t){ 
     System.out.println("oops...error...good luck debugging. "); 
    } 
} 
+0

Никто не может предложить более ленивый способ справиться с исключениями, что это :) – rana