2009-12-15 4 views
1

다음과 같은 try-catch 문이 있는데 메시지 속성에 '내 오류'라는 텍스트가 있으면 예외를 throw하지 않습니다.C에서 예외를 프로그램 적으로 표시하지 않습니다.

어떻게 프로그래밍 방식으로이 작업을 수행 할 수 있습니까? 또한, 이것은 코드 - 냄새로 간주됩니까?

try 
{ 
} 
catch(Exception e) 
{ 
    if(e.Messages.Contains("My error")) 
    { 
     //want to display a friendly message and suppress the exception 
    } 
    else 
    { 
     throw e; 
    } 
} 
+4

이것은 나쁜 코드 냄새입니다. 어떤 이유로 든 프레임 워크와 함께 살아야한다면, 코드가 수행 할 동일한 유형의 예외 만 throw합니다. 그러나'throw e;'또는'throw '(보통 당신은 후자를 원할 것입니다)를 쓰든간에 차이가 있음을 주목하십시오. –

+5

이 냄새가 나쁜 또 다른 이유는이 기술을 사용하면 오류 문자열을 다른 언어로 현지화하지 못하게 할 수 있습니다. 또는 다른 사람의 오류 문자열을 찾는 경우 다음 버전에서 문자열을 변경하거나 사용자가 프랑스어 인 것으로 감지되면 다른 문자열을 가질 수 있습니다. –

+0

그렇습니다. 전 동료가 대량의 Java 응용 프로그램에서 모든 catch (Exception e)를 catch (Throwable t)로 바꾼 경우보다 실제로 더 나쁠 수 있습니다. –

답변

11

찾고있는 특정 예외를 catch하고 있어야합니다. 솔직히 말해서, 그 코드는 충격적입니다. 당신은 간단한 텍스트 변화가 이상한 부작용이있을 수 있기 때문에

try { 
    MyCoolMethod(); 
} catch (MyCoolException e) { 
    // do some stuff 
} 
+0

충격을 주려면 +1. 그것은 실제로는 아니지만, 나는 더 이상 그것에 의해 충격을받을 수있는 방법을 너무 많이 보았습니다 :) – womp

14

오류 테스트를 기반으로 오류를 포착해서는 안됩니다. 예외를 확장하는 자신 만의 예외 클래스를 만들어야합니다 :

class MyErrorException : Exception { } 

그리고 던지고 잡아라. (구문이 틀렸다면 실례지만, C#을 한 번도하지 않았습니다.)

사실, 예외를 전파하는 대신 자신의 예외를 던지고 잡는 것은 완벽하게 정상이며 예외 처리를 실제로 수행하는 방법입니다.

+1

+1 -하지만 그건 자바 표기법입니다. C#에서는 다음과 같습니다. class MyErrorException : System.Exception {} – kiwipom

+1

Claudiu가 맞습니다. 예외가 발생했는지 여부를 알 수 없습니다. 그런데 클라우 디우 (Claudiu)에 따르면, 올바른 문법은 클래스를 파생시키는 콜론이다 : class MyException : Exception {}. ' –

+2

당신 (그리고 지금까지 다른 모든 응답자)은 예외를 던지는 코드를 제어한다고 가정합니다. 확실히 그럴까요? – itowlson

7

코드는 유지 보수 문제를 만듭니다 ... 나중에 코드에서 다음

public class MyCoolException : Exception { 
    public MyCoolException(string msg) : base(msg) {} 
} 

public void MyCoolMethod() { 
    // if bad things happen 
    throw new MyCoolException("You did something wrong!"); 
} 

당신처럼 사용할 수 있습니다 ... 같은 것을해야한다 . System.Exception으로부터 상속받은 자신 만의 예외 클래스를 가질 수 있습니다. 그런 대신을 필요없이 다음을 수행 할 수있는 경우 : 그것은 스택, 그냥 throw; 할 것 구명하지 않기 때문에

try 
{ 

} 
catch(MyException myException) //or just catch(MyException) 
{ 
    //display a friendly message 
} 

또한 당신은 throw e하고 싶지 않아.

+2

+1 또한'throw e' 문을 호출합니다. 예외를 되돌리기위한 올바른 방법은 간단히'throw;'입니다. – Aaronaught

+0

downvote에 대한 이유가있을 수 있습니까? –

0

파생 된 클래스가 아닌 Exception을 throw 할 때 항상 실패한 어설 션을 의미합니다. 나는 요청을받을 수 있기 때문에 백엔드가 실패하는 것을 좋아하지 않는다. 우리가 정말로 토스트 인 경우 어쨌든 다음 요청에서 오류가 발생합니다.

백엔드에서 오류 메시지를 생성해야하는 경우 Exception에서 상속 받고 ErrorMessage 및 ErrorMessageTitle을 생성자 인수로 사용하는 ErrorMessage 클래스가 있습니다.

관련 문제