2012-10-16 2 views
32

나는 어떤 타입이나 예외를 포착 해보고 싶다.이 코드는 충분하다 (자바에서 할 수있는 방법이다)?C#에서 try 및 catch를 사용하여 모든 예외를 catch하는 방법은 무엇입니까?

try { 
code.... 
} 
catch (Exception ex){} 

아니면

try { 
code.... 
} 
catch {} 

해야 하는가?

+4

왜 그렇게하고 싶습니까? 처리 할 수있는 예외 만 잡아야합니다. – Oded

+0

두 가지 모두 작동합니다 ... – pengibot

+0

Google에 매우 쉬운가요? – jgauffin

답변

38

두 가지 방법 모두 모든 예외를 포착합니다. ex이 선언되었지만 사용되지 않았기 때문에 컴파일러 경고를 생성한다는 점을 제외하고 두 코드 예제 간에는 큰 차이점이 없습니다.

그러나 일부 예외는 특별하며 자동으로 다시 적용됩니다.

ThreadAbortException은 잡힐 수있는 특별한 예외이지만 catch 블록의 끝에서 자동으로 다시 발생합니다. 코멘트에서 언급 한 바와 같이

http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx


, 일반적으로 잡아 모든 예외를 무시하는 매우 나쁜 생각입니다. 일반적으로 다음 중 하나를 수행하려고합니다.

  • 치명적이지는 않은 예외를 찾아서 무시하십시오.

    catch (SomeSpecificException) 
    { 
        // Ignore this exception. 
    } 
    
  • 모든 예외를 캐치하고 기록하십시오.

    catch (Exception e) 
    { 
        // Something unexpected went wrong. 
        Log(e); 
        // Maybe it is also necessary to terminate/restart the application. 
    } 
    
  • 캐치 모든 예외는, 몇 가지 정리를 할 다음 예외를 다시 던진다. 마지막 경우에 예외 throw;하지 throw ex;를 사용하여 슬로우 다시 것을

    catch 
    { 
        SomeCleanUp(); 
        throw; 
    } 
    

참고.

+0

불행히도 릴리스 모드에서는 모든 예외가 catch되지 않습니다./ – Muflix

+3

Muflix는 catch {}가 모든 예외를 catch하지 않는 이유를 자세히 설명 할 수 있습니다. 릴리스 모드 [?]? –

1

두 가지 모두 괜찮지 만 첫 번째 것만 예외를 검사 할 수 있습니다.

두 가지 모두 예외를 삼켜 버리고 의미있는 일을하기 위해 예외를 잡아야합니다. 문제 숨기기는 이 아니라입니다. 당신은 당신이

try { 
code.... 
} 
catch (Exception ex){} 

및 catch 블록에서 사용 전보다를 사용하는 것보다 catch 블록에서 예외 객체 뭔가를해야 할 경우

0

두 가지 방법이 정확합니다.

어쨌든 Exception 클래스를 cathc하는 것이 항상 좋은 것은 아니지만 더 구체적인 예외를 예상하는 것이 더 나은 방법입니다. 예외는 예상 할 수 있습니다.

3

모든 예외는 Exception에서 파생되므로 위의 두 가지 모두 작동합니다.

왜 이렇게하고 싶은지 물어볼 것입니다. 복구 할 수있는 예외 만 잡아야합니다. 다른 모든 것은 응용 프로그램을 끔찍한 죽음으로 몰아 넣어야합니다. 응용 프로그램이 손상된 상태로 계속 진행하는 것보다 응용 프로그램이 충돌하는 것이 좋습니다.

+0

예외를 처리하고 싶지 않습니다. 난 그냥 내 프로그램이 발생하지 않으면 추락하지 않기를 바란다. –

+0

그래서 뭔가 잘못되었다고 사용자에게 알리지 않을 것이다. ... –

+4

실제로 여러 가지 가능한 유스 케이스가있다. 이. 웹 서비스에서 여러 개의 (50,000 개 이상) 리소스를 일괄 적으로 가져올 때 (예 : 잘못된 HTTP 오류, 서비스 시간 초과, 500 개의 내부 서버 오류를 반환하는 서비스를 포함하되 이에 국한되지 않는 모든 가능한 오류를 포착하고 싶습니다.), 로그하고 계속하십시오. 여기서 중요한 것은 개별 웹 호출에 대해이 작업이 실패 할 수있는 모든 방법을 아직 알지 못한다는 것입니다. –

2

다른 모든 의견 외에도 약간의 차이가 있음을 유의하십시오. 완전한 차이는 여기에 설명되어 있습니다.

빈 catch 절을 사용하면 어셈블리에 "RuntimeCompatibility (WrapNonExceptionThrows = false)"(CLR2 이후 기본적으로 true)로 표시되어있을 때 CLSCompliant 예외를 catch 할 수 있습니다. [1] [2] [3]

[1] http://msdn.microsoft.com/en-us/library/bb264489.aspx

[2] http://blogs.msdn.com/b/pedram/archive/2007/01/07/non-cls-exceptions.aspx

[3] Will CLR handle both CLS-Complaint and non-CLS complaint exceptions?

1

I 오류 때문에, 모든 예외를 catch하고 데이터베이스에 저장 쉽게 수정 될 수있다 - 페이지, 장소, 날짜 등이

저장

try 
{  
    Cart = DB.BuyOnlineCartMasters.Where(c => c.CmpyID == LoginID && c.Active == true).FirstOrDefault(); 
} 
catch (Exception e) 
{ 
    ErrorReport.StoreError("CartMinifiedPartial-Company", e); 
    -- storing the error for reference 
} 

저장3210

public static void StoreError(string ErrorPage, Exception e) 
    { 
     try 
     { 
      eDurar.Models.db_edurarEntities1 DB = new Models.db_edurarEntities1(); 
      eDurar.Models.ErrorTable Err = new eDurar.Models.ErrorTable(); 
      Err.ErrorPage = ErrorPage; 
      if (e.Message != null) 
      { 
       Err.ErrorDetails = e.Message; 
      } 
      if (e.InnerException != null) 
      { 
       Err.InnerException = e.InnerException.Message.ToString(); 
      } 

      Err.Date = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time")); 
      DB.ErrorTables.AddObject(Err); 
      DB.SaveChanges(); 
} 
0
static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
    } 

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 
+0

코드 만 대답하면 좋은 대답이 아닙니다. 몇 줄을 추가하여 문제가 무엇인지 설명하고 코드가 코드를 수정하는 방법을 알려주십시오. – MikeT

-1

시도 {

.. .. ..

}

캐치 (예외 예) {

.. .. ..

} 예외 ex는 모든 예외를 의미합니다.

관련 문제