2010-07-06 3 views
11

.net 3.5에서 asp.net 웹 응용 프로그램을 만들고 사용시기와 사용하지 않을시기를 알고 싶습니다. 특히, 내 try catch의 대다수는 저장된 procs를 실행하고 textfields 또는 gridviews를 채우는 것에 둘러싸여 있습니다. 저장 프로 시저를 실행하고 데이터 표시 컨트롤을 채울 때 캐치 시도 EVERYTIME을 사용 하시겠습니까?사용시기 및 사용하지 않을 때 마지막으로 시도하십시오.

protected void AddNewRecord() 
    { 
     try 
     { 
      //execute stored proc 
      // populate grid view controls or textboxes 
     } 
     catch (Exception ex) 
     { 
      //display a messagebox to user that an error has occured 
      //return 
     } 
     finally 
     { } 
    } 
+0

도 참조하십시오. http://stackoverflow.com/questions/505471/how-often-should-i-use-try-and-catch-in-c – 0x49D1

+0

"CLR via C#"제 3 판 , J. Richter. 예외 처리 개념을 아주 자세하게 다루며, 확실히 좋은 참고 자료입니다. – ileon

답변

10

대답은 "이 달려있다"입니다 :

내 코드 블록은 보통처럼 보인다.

모든 원자 작업을 중심으로 try{...} catch {...}을 사용하면 문제가있는 경우 트랜잭션을 사용하여 마지막으로 양호한 상태로 롤백 할 수 있습니다. 이것은 하나 또는 여러 개의 저장 프로 시저 일 수 있습니다 - 응용 프로그램에 따라 다릅니다.

예외를 트래핑하는 경우 catch하는 예외가 명시되어 있는지 확인하십시오. catch (Exception ex) 또는 catch()을 "모두 캐치"예외 처리로 사용해서는 안되지만 대신 catch (IndexOutOfRangeException ex)과 같은 특정 catch 문을 사용해야합니다 (예 :).

그러나 예외를 처리 할 수 ​​없거나 정리 작업을 수행 할 수없는 경우에는 처리하지 않아야합니다.

+0

"원자"작동이란 무엇입니까? – user279521

+2

http://en.wikipedia.org/wiki/Atomic_operation –

+3

@ user279521 - "원자"- 더 이상 나눌 수없는 원자와 같습니다. 여러 단계가있을 수 있지만 각 단계는 자체적으로 수행하면 아무런 의미가 없습니다. 예를 들어, 코드에서 버그를 수정했지만 여러 클래스에 대한 편집이 필요하다면 모든 파일을 체크 인하는 것은 아무런 의미가 없다는 것을 확인하는 것만 큼 원자 적이라고 할 수 있습니다. – ChrisF

0

대부분의 경우 예외를 포착해서는 안됩니다. 예를 들어 예외를 잡는 것이 타당한 곳 (예 :

)

해당 예외에서 복구 할 수있는 경우 코드를 기록하거나보고해야하는 경우 (예 : 사용자에게) - 일반적으로 코드의 최상위 수준입니다. 코드 호출자가 예외를 처리 할 수 ​​없으므로 다른 오류 형식으로 변환해야합니다.

또한 using 블록 문을 사용하여 IDisposable 개체에서 Dispose를 실제로 호출 할 수 있으므로 try ... finally가 필요하지 않습니다.

+0

사용자에게 "데이터를로드하는 동안 오류가 발생했습니다"라는 메시지 상자를 표시하려면 어떻게해야합니까? Try Catch 블록이 없으면 어떻게 할 수 있습니까? – user279521

+0

예외 상자를 팝업으로 표시하려면 try-catch가 필요합니다. –

+0

내가 말했듯이 코드의 최상위 레벨에만이 기능이 필요합니다. "사용자가 기록하거나보고해야하는 경우 (예 : 사용자에게) - 일반적으로 코드의 최상위 레벨에 있습니다. " – Polyfun

4

catch 블록에서 예외를 처리하려는 경우에만 try catch을 사용해야합니다. 내가 처리하는 것이 의미하는 것은 오류를 기록하고 오류를 기록하기 때문에 다른 경로를 선택하는 것입니다. 단지 다시 던지려는 의도가 있다면 잡으려고 할 필요가 없습니다.

+1

오류를 기록하려면 예외가 발생한 지점에서 예외를 catch 할 필요가 없습니다. 대신 코드의 아무 곳에서나 발생하는 예외를 기록하는 코드의 종료 지점에서 catch를 사용할 수 있습니다. – Polyfun

+0

당신은 좋은 지적을하고 있습니다. 그러나 나는 그것이 어플리케이션의 전반적인 아키텍처에 크게 달려 있다고 생각합니다. 실제로 나는 try catch를 사용할 가능성이있는 예를 제공하고있었습니다. – kemiller2002

+0

블록의 모든 코드를 실행하는 데 객체의 불변량이 의존한다면 어떻게 될까요? 나는 그런 경우에, 객체의 불변 값이 유지되지 않을 때 예외가 발생하면 객체를 명시 적으로 무효화 할 블록에 의해 코드가 보호되어야한다고 생각할 것이다. 예외로 인해 호출 코드에서 손상된 객체를 포기하게되면 손상된 객체를 버리는 행위로 문제가 해결됩니다. 호출 코드가 손상된 객체를 사용하려고 시도하면 이러한 시도는 예외를 일으켜 상황이 해결되거나 모두 죽을 때까지 다시 풀어 야합니다. – supercat

1

다른 사람들이 말했듯이, 그것은 달려 있습니다. 나는이 상황에서/잡기/finally 블록을하려고 사용하는 경향이 :

  • 내가 단순히 그것을 다시 던지는 이외의 방법으로 예외를 처리해야합니다.

  • finally 블록의 일부 리소스를 정리해야합니다.

이러한 두 가지 상황 이외에 나는 호출 코드가 발생할 수있는 모든 예외를 처리하도록합니다. 또한

+0

'사용'은 기본적으로 자원을 정리하기위한'try-finally' 블록입니다 ('Dispose'를 통해). – Brian

+0

@Brian - 올바른 것이지만 정리가 필요한 모든 항목이 항상 IDisposable (또는 Dispose)을 구현하지는 않습니다. –

1

다른 사람들이,이 일을 방지하기 위해 반드시 말했다하기 :

try 
    { 
     throw new ApplicationException("Fake sql ex"); 
    } 
    //catch and do nothing. swallowing exceptions 
    catch(Exception){ }     
+2

포켓몬 예외 처리 : 모두 잡아 야 해! –

0

Exception 저장 프로 시저에서 기대하는 무엇?pokemon exception handling을 사용하지 않고 응용 프로그램에서 수행 할 것으로 예상되는 작업을 정확히 알면 특정 예외에 맞지 않는 내용이 Application 개체에 걸리게됩니다. 즉

catch {} 또는 catch (Exception)하지만 전문 예외 처리를 사용하지 마십시오

catch(SqlException e) 
{ 
    // Log stacktrace and show a friendly error to your user 
} 

Application.Error 이벤트가 예기치 않은 동작이 잡힐해야하는 위치이며, 단순히 당신에게 고객의 수익을하는 것보다 추적하기가 쉽습니다 "내 밭은 아무것도 보이지 않는다"고 말했습니다.

+0

특별한 예외는 없지만 "안전하기"때문에 과거에는 모든 데이터베이스 호출을 try catch 블록에 래핑해야한다고 들었습니다. – user279521

+0

하지만 예외를 잡을 필요는 없습니다. 당신은 행복하게 모든 SqlExceptions 또는 당신이 사용하는 데이터베이스를 잡을 수 있습니다.다른 것이 던져지면 아마 죽어가는 대신 그것에 대해 알고 싶어 할 것입니다. –

0

특정 예외가 발생할 때 계속 실행해야하는 가장 안쪽 루프에서 "try catch"를 사용하십시오. 10,000 회 실행되는 루프가 있고 예를 들어 예외가 발생할 경우주의하십시오. 다른 9,990에 영향을 미치지 않을 열 번째 반복은 예외를 잡아 내고 루프가 계속 진행되도록하는 데 유용 할 수 있습니다. 반면에 예외가 루프를 통해 11 번째, 12 번째, 13 번째 등의 오류가 발생했다는 오류가 표시되면 예외를 루프 재 시도를 유지하는 것보다 훨씬 빨리 종료 할 수 있습니다 그것은 작동하지 않을 것입니다.

관련 문제