2009-08-05 3 views
3

큰 소프트웨어에서 소스 코드 줄 당 예상되는 catch 문 수는 얼마입니까?코드 행에 대한 catch 문의 비율이 높음

예를 들어 C#으로 작성된 소프트웨어에서 Visual Studio는 "catch"라는 단어가 포함 된 약 350 줄을 표시하고 cloc은 약 160k SLOC, 30k 주석 처리 된 줄 및 15k 빈 줄이 있다고보고합니다. 160k/350은 catch 문당 대략 467 행의 코드입니다.

우리는 표준 줄을 사용하여 표준 C# 형식을 사용하기 때문에 소금을 사용합니다. 따라서 160k 중에서 얼마나 많은 줄이 하나의 줄임말인지, 그리고 160k는 트리가 더 이상 응용 프로그램에 컴파일되지 않습니다. "유용한"비율이 400 LOC 당 1 캐치에 더 가깝습니다.

놀랍지도 않지만, 우리는 빈 catch 블록에서 잡히고있는 준 비판적 예외를 놓쳤다. 그래서 이제는 코드베이스를 살펴보고 적어도 디버그 콘솔에 대한 예외를 인쇄하고있다. 일시적인 조치로서, 또는 잡힌 예외에 대해 더 구체적이되는 것. 이것은 물론 우리가 전체 적용에서 가지고있는 어획량을 증가 시키지만, 그것은 "수용 가능한"지역에 가까운 곳에서 우리를 데려다 줄 것인가? 나는 467 LOC 당 1 캐치가 좋은지, 그냥 괜찮은지, 아니면 끔찍한 지 전혀 모른다.


저는 에 대해 알고 있습니다. 왜은 빈 캐치 블록을 사용하지 않습니다. 다른/이전 관리자들은 게으르다. 그리고이 제품의 다음 릴리스는 시간이 중요하기 때문에 현재 300 개 (?)의 잘못된 catch 문을 올바르게 수정하고 소프트웨어가 올바르게 작동하는지 확인할 시간이 없습니다. (물론 우리는 실제로 자동화 된 기능이 없습니다. 테스트를 쉽게하기 : /).

내가 얼마나 자주 잡아 먹어야하는지에 관해 "gut feel"이 있는지 찾고 있었다. 문맥에 구애를 받는다는 답변이 두 가지 있습니다. 의심 스럽지만 잘 모르겠습니다.

답변

10

일반적인 수치를 제공하는 것은 매우 어렵습니다. 실제로 응용 프로그램이 수행 할 작업과 복구 가능한 방식으로 실패 할 수있는 작업을 수행해야하는지 여부에 따라 달라집니다.

제거해야 할 가장 중요한 점은 빈 캐치 블록은 정말 나쁜 아이디어라는 것입니다. 이는 catch 블록 당 코드 행보다 훨씬 중요합니다.

+0

빈 try 블록 자체가 나쁜 아이디어가 아닙니다 (즉, 올바르게 사용할 수 있음). 주요 프로그래머는 오류를 로깅하고 사용자 피드백을 제공해야하는 곳에서 끔찍하게 학대하는 것입니다. – Noldorin

+0

빈 try-catch 블록을 다루면서이를 기반으로 또 다른 질문을 봅니다. [빈 캐치가 왜 나쁜 생각을 차단합니까?] (http://stackoverflow.com/questions/1234343/why-are-empty-catch-blocks- 나쁜 아이디어). – Lode

+4

Noldorin과 동의하지 않으며 빈 catch 블록이 항상 잘못되었다고 제안합니다. 완전히 무시하고 싶은 특정 유형의 문제가있는 경우 catch 유형을 한정하여 예상되는 오류 유형 만 무시합니다. 몇 가지 방법 : << catch (VerySpecificExceptionType ex) {} >> 또는 << catch (Exception ex) {if (ex.Message! = "예상했던 것") throw; } >> 나는 비어있는 catch 블록이 괜찮을 수도있는 counter-examples에 개방적이지만 회의적이다. :) – pettys

13

실제로는 으로 처리하지 않는 한 예외를 포착해서는 안됩니다.을 처리하십시오. 처리기가 예외를 "실행 취소"하거나 다른 방법으로 값을 추가 할 수있는 경우가 아니면 사람에게 예외 처리를 허용해야합니다.

+2

고마워요! 너무 많은 사람들이 아무 것도하지 않고 예외를 잡습니다. 예외를 처리하지 않으려면 응용 프로그램의 맨 위에 하나의 catch를 놓고 예외를 기록하고 사용자에게 메시지를 보냅니다. 예외가 두어 백 곳에서 잡히지 만 결코 처리하지 않는 코드를 통해가는 것은 싫다. –

6

나는 이와 같은 통계를 완전히 무시합니다. 코드 라인 계산은 반드시 유용한 지표는 아닙니다. 특히 비율을 찾는 경우 유용합니다.

실제 답변은 문맥에 완전히 달려 있습니다. "올바른"catch 문 수는 발생할 수있는 예외를 처리하는 데 필요한 try/catch 블록의 양으로, 올바르게 처리 할 수 ​​있습니다. 제대로 처리 할 수있는 예외가 발생하면 try/catch 블록이 있어야합니다. 당신이 그것을 다룰 수 없다면 (또는 그것을 다루고 싶지 않을 때), 그것이 위쪽으로 전파되도록하십시오 - 그것을 잡지 마십시오.

catch 블록의 양은 작성중인 코드의 유형에 따라 다릅니다.예를 들어, 네트워킹 코드를 작성하는 경우 예외 처리가 더 많이 발생할 수 있습니다 (네트워크는 사실상 처리해야 할 문제가있을 가능성이 큽니다).

2

대단히 중요한 통계로서, 내 경험에 따르면 예외를 기록 할 모든 이벤트 처리기에 적어도 하나는 있어야합니다.

다른 방법과 관련하여 try-catch-free로 설정하는 것이 좋습니다. 그런 말로는, 여러 번, catch 블럭을 추가하여 귀찮은 오류보고 ("parameter = value")에 상태를 추가 한 다음 기본 처리기로 "throw"합니다. 만약 당신이 버그 수정에 능숙하다면,이 접근법은 많은 죽은 코드로 이어집니다.