2017-02-16 13 views
0

내 연구에서이 질문은 초기 닷 넷에서 많이 요구되었지만 IMHO에서는 많은 반응이 조금 나 빠졌고 ' 그게 우리가 지금하는 방식이야. '스타일. 그물이 조금 커지면 보자. 예 년경 1992C#의 오류 고토 (catch-all) 레이블에 대한 현대적인 접근

: 그것이

Sub Main() 
On Error GoTo ErrHand 
....Code Here 
End Sub 

ErrHand: 
    ' raise error nicely here inc error no, desc, line & character pos 
End Sub 

어설픈대로 '오류에 고토 [캐치 올] 라벨'VB6에서 사용할 접근 방식은 예상치 못한 예외를 포착하고이를보고 있던 사용을했다. 모듈 번호, 예외의 행 번호 및 문자 위치와 함께 오류 번호 & 설명을보고 할 수 있습니다. 부지런한 개발자는 물론 예상되는 예외 및 비즈니스 논리 예외에 대한 코드를 작성합니다. 실수시 크리스탈 볼을 사용하지 않는 것에 대한 매우 유용한 해답이었습니다.

내 C# 친구들은 try-catch를 사용하라고 말하지만 동시에 folk-lore는 나쁜 방법이기 때문에 각 방법에 큰 try-catch를 넣지 말라고합니다.

그러나 내가 민속 전언의 정확한 출처에 대해 물을 때 대답이 없습니다.

그래서 오류 goto [catch-all] 레이블 구조에서 VB6의 C# equiv에 대한 2016 응답은 무엇이며 왜 각 모듈의 내용을 다음과 같이 표준화 된 try-catch로 줄 수는 없습니까? 같은 예기치 않은 예외 처리에 영향을 미칩니 까?

+1

try/catch 라운드를 수행하는 것이 좋지 않다고 생각하십니까? 그렇습니다. 왜 전에 일종의 괜찮 았던 지 ... 우리가 전에 didnt하기 전에 잘 우리가 가지고있는 많은 것들이 있습니다. 이제는 if (stuff? .somethingelse == blah)를 사용하여 null 및 값을 테스트 할 수 있으므로 null로 바뀌지 않으므로 tryparse로 숫자 변환을 확인할 수 있습니다. 엄지 손가락 규칙은 이제 훨씬 더 현지화 된 테스트입니다. 코드가 진화하고 vb6으로 돌아가는 것은 40 년 전의 삶을 비교하는 것과 같습니다. 너무나 많이 변경되어 실제로 비교하기가 어렵습니다. – BugFinder

+1

try {/ * ... 여기 코드 * /} catch (Exception ex) {...}. VB에서의 접근 방식보다 직접적인 변환이 가능합니다. Main() 진입 점에서 최상위 수준의 catch-em-all은 끔찍한 사례는 아니지만 일반적으로 AppDomain.CurrentDomain.UnhandledException 이벤트를 구독하는 것이 좋습니다. –

+0

@BugFinder 감사합니다. 저는 게으른 해결책을 찾고 있지 않습니다 - 더 많은 벨트와 브레이스. 예외가 발생합니다. 우리는 귀하의 의견에 따라 예상 한 것을 처리하기 위해 열심히 노력하고 있습니다. 앱 소유자는 실시간으로 예외가 발생할 때 가장 빠른 수정을 원합니다. 즉, 정보가 필요하다는 의미입니다.즉, 예외를 잡아서 조사해야 사용할 수있는 단서를 얻을 수 있습니다. 그러므로 내 질문. VB6를 컨텍스트를 설정하는 빠른 방법이라고 언급하기로 결정했습니다. MS tool dev의 40 년은 반드시 우리가 더 나아진 것을 의미하지는 않습니다. –

답변

2

오류의 성격을 모를 때는 무엇을 할 수 있습니까? 단지 합리적인 일은 오류를 기록한 다음 종료하는 것입니다. 프로그램의 상태를 추론 할 수는 없습니다. 여러분이 아는 것은 그것이 여러분이 생각한 것이 아니라는 것입니다.

마찬가지로이 상황을 처리하는 가장 좋은 장소는 AppDomain.UnhandledException 또는 이와 유사합니다 (설명서에는 특정 응용 프로그램 모델에 적용될 수있는 다른 방법이 설명되어 있음).

그런 식으로 코드를 한 번 쓰고, 함수 당이 아닌 한 번 씁니다. (작은 "장난감"응용 프로그램을 쓰지 않는 한 요즘은 단일 스레드 응용 프로그램을 작성하는 것이 거의 불가능합니다. On Error Goto 패턴은 새로운 기능의 진입 점으로 작용하는 모든 기능에 대해 적어도 반복되어야합니다 당신이 try/catch를 작성하는 경우 오류 상황에서 복구 처리 및 에 대한 특정 전략을 가지고 있기 때문에 스레드) 다른 곳

는, 그것은해야합니다.

+0

감사합니다 - 링크 된 페이지를 읽고 응답합니다. 당신이 잘못한 것을 모를 때 다시하라. 나는 동의하지만, 요점은 예외에 관해서 뭔가를 포착해서 더 빠른 진단과 해결책을 얻을 수있는 길을 가지기위한 것입니다. IMHO는 처리 할 수없는 예외를 초래하는 결실이있을 것이라는 사실을 받아 들여야하는 종입니다. 이 토론에서 나는 원인에 덜 초점을 맞추고 더 많은 시간을 맞추기 위해 노력합니다. 그 원인은 다른 노력에 의해 처리되지만 첫 번째 요점은 있습니다 - 처리되지 않는 예외가있을 것이고 나는 그때 어떻게 든 함정에 빠지기를 원할 것입니다. 이것은 '오류 발생'이 허용하는 것입니다. –