Try-Catch 내에 모든 명세서를 작성해야하는 이유는 무엇입니까?


12

회사 책임자는 Try-catch 문 내에서 모든 코드, 즉 모든 코드를 작성해야한다고 말합니다. 이제는 '죄송합니다.보다 안전합니다.'접근법을 이해할 수는 있지만 레이블을 만들 때 양식의 위치가 설정되면 예외가 있다고 생각하기에는 너무 마음에 들지 않습니다. 이러한 간단한 작업에서 예외가 발생한 경우가 있습니다.


4
이는 모든 SQL을 더 나은 성능을 위해 저장 프로 시저로 작성해야 한다고 말하는 동일한 사람들에 의한 버즈 용어 처럼 들립니다 .
spong

5
"코드가 런타임 오류를 생성하면 해고됩니다." 닭의 게임은 상대방이 스티어링 휠과 브레이크 페달을 창 밖으로 던질 때까지 재미 있습니다.
JeffO

4
@ Jeff O-저는 소프트웨어 개발에서 상대방이화물 열차라고 생각합니다.
Joris Timmermans

5
이 스타일의 예외 처리에 대해 들었던 가장 좋은 표현은 "시체를 똑바로 세우지 않는 것"입니다. 즉, 응용 프로그램이 예기치 않은 상태가됩니다. 빨리 실패, 크게 실패는 훨씬 더 현대적인 접근 방식이므로 실제로 모든 버그를 해결할 수 있습니다.
Brook

2
요청의 주제는 부적절합니다 ... 단지 "내 회사 책임자는 내가 코딩해야한다고 말합니다 ..."라는 말은 큰 위험 신호입니다. 그것은 소액 관리입니다 ... 이것은 그의 일이 아닙니다.
JoelFan

답변:


14

회사 책임자는 Try-catch 문 내에서 모든 코드, 즉 모든 코드를 작성해야한다고 말합니다.

글쎄, 이것은 약간 과장되었으며 시끄러운 코드로 이어집니다. try catch 처리기로 작성된 모든 코드 (예 : 각 방법)의 이점은 무엇입니까? 대부분의 경우 수정해야 할 오류가 있음을 알려줍니다. 종종 예외는 처음부터 피할 수 있고 피해야합니다.

오류 추적 방법이 catch 자체를 수행하지 않더라도 스택 추적을 살펴보면 코드의 원인을 파악하기에 충분합니다. 개발자가 예외로 스택 추적을 손상시키는 경우가 있지만 많은 예외 처리기가있는 경우가 훨씬 더 흔합니다. 무엇이든 : 약간은 좋지만 너무 많은 것은 독입니다.

예외 처리는 실제로 매우 간단합니다.

캐치 예외

  • 예외에 대한 반응으로 특별한 조치가 필요할 때마다
  • 예외가 처리되지 않으면 프로그램이 일관성이없는 상태가 될 때마다

당신이 그것에 대해 생각한다면, 가장 항상 발생하는 예외를 처리하기에 좋은 곳이 하나뿐입니다. 따라서 처리기는 그 자리에 있어야합니다.

많은 예외는 처음부터 발생해서는 안되므로 예외 처리를 중심으로 제어 구조를 구축하지 말고 가능한 경우 언제 어디서나 예외가 발생하지 않도록하십시오.

상황이 (복구 불가능하게) 잘못되면 일찍 충돌하는 것을 잊지 마십시오. try-catch 문에 모든 코드를 넣는 것은 터무니 없지만 모든 예외를보고하고 기록하는 것을 잊지 마십시오.


+1 이로 인해 잡음이 많은 코드뿐만 아니라 성능이 저하됩니다. try 블록에 명령문을 넣으면 HotSpot 컴파일러는 다른 방법으로 최적화를 적용 할 수 없습니다.
Oliver Weiler

@Oliver Weiler : 시도 / 캐치 블록에서 HotSpot 컴파일러가 수행하지 않는 최적화를 설명하는 인용이 있습니까?
Kaypro II

16

그러나 레이블을 만들 때 폼의 위치가 설정되면 예외가 있다고 생각하기에는 너무 마음이 아프지 않습니다. 이러한 간단한 작업에서 예외가 발생한 경우가 있습니다.

확실히 맞아요! 항상 예측하지 못한 일이 잘못 될 수있는 방법이 있습니다. "치킨 마음"은 이러한 맥락에서 사용하기에 어리석은 표현입니다. 소프트웨어 개발은 ​​잠재적 인 문제를 무시함으로써 당신의 마키스 모를 증명하는 것이 아닙니다.

무엇 이다 올바른 질문을하는 것은 그것의 여부 유용한 예외가 귀하의 코딩 표준들이해야 할 말 시점에서 잡힐 때까지. 당신의 진술은 모든 메소드 본문 주위에 try / catch 블록을 가지고 있어야한다고 읽습니다. 실제로 예외적으로 유용한 것을 즉시 할 수 없기 때문에 실제로 터무니 없습니다. 실제로 예외의 요점입니다. 적절한 시점에 처리 할 콜 스택을 전파하십시오.


13
내 앱은 예외를 던지는 것보다 더 잘 알고 있습니다. 그들이 당신이 닭이 마음에 든다고 생각하면, 그들은 온통 부서 질 것입니다.
JeffO

@ Michael Borgwardt : hehe, 그래서 당신은 저를 downvoted했습니다. 이 질문에 대해 downvoted하고 유일한 downvote는 내 게시물에 있습니다. 자존심이나 자존심에 심각한 문제가있는 것 같습니다. 다른 질문에서도 그 사실을 알았습니다. 다른 프로그래머들도 좋은 답을 가지고 있습니다.
팔콘

@ 팔콘 : 나는이 질문에 대해 아무것도 공감하지 않았다. 나는 당신이 어떻게 다른 말을 믿게할지 모르겠지만, 누군가 자아에 심각한 문제가 있다면 그것은 당신입니다.
Michael Borgwardt

@Michael Borwardt : 어쩌면 내가 틀렸다. 이 경우 사과드립니다. 그것은 당신이 여기서 당신이 downvoted했다고 생각하게 한 당신 자신의 질문에 대한 downvote 일 수 있습니다. 죄송합니다.
팔콘

8

나는 이것을 다른 방향으로 돌릴 것입니다. 예, 일반적으로 예외 처리는 좋은 일이지만 실제로 가능한 모든 예외를 잡는 시점에서 현명한 방식으로 처리 할 수 ​​있습니까? 때로는 미션 크리티컬 한 소프트웨어를 작성하지 않는 경우 상황이 끔찍하게 잘못 될 경우 중간에 제어되는 방식으로 충돌하거나 태우는 것이 좋습니다.

잡힐 수있는 모든 단일 예외를 처리 할 수 ​​있다고 100 % 확신 할 수 없다면 프로그램의 기본 루프를 래핑하여 일반적인 예외 처리기를 작성하는 것이 좋습니다. 작업중인 언어에 따라 달라집니다. 예외에 대해 최대한 상세하게 기록하고, 프로그램 상태를 저장하십시오 (현재 사용자가 작업중인 데이터 저장소가 아닌 다른 곳 -이 시점에서 모두 손상 될 수 있음을 기억하십시오) ), 등등. 그런 다음 예외를 다시 발생시키고 OS가 적절하게 처리하도록하십시오. 이 모든 예외 처리기에서 치명적인 오류에 대비하십시오.. 그런 다음 프로그램이 다시 시작될 때이 상태가 유용한 지 확인하고 복구 가능한 경우 복구 할 수있는 항목을 복원하십시오. 사용자에게 버그 보고서를 다시 보내도록 제안 할 수도 있습니다.


5
+1 : 즉시 올바르게 처리 할 수없는 경우 예외를 포착하지 마십시오. (아아, 때때로 당신은 다시 로밍하기 위해 그것을 붙잡아 야하지만 API 강제의 일환으로 다른 유형으로 태그되었습니다 : 나는 그것을 싫어합니다.)
Donal Fellows

6

catch 블록은 리소스 측면에서 너무 비싸기 때문에 try / catch를 많이 사용하면 전체적으로 사용되지 않습니다. 시험 사용은 위험 관리를 상기시킵니다 . 위험 관리에는 두 가지 차원이 있습니다.

  1. 위험이 발생할 확률
  2. 그것이 가질 수있는 피해

이제 집을 나가면 피아노가 머리 어딘가에 떨어지면 일어날 가능성은 적지 만 (0.001 %) 사망 할 수 있습니다.

예외 처리는 이와 같습니다. 시도 블록은 비싸지 않습니다. 그러나 catch 블록은 스택 추적 테이블을 만들고 다른 작업을 수행해야하기 때문에 실제로 비용이 많이 듭니다. 따라서 try / catch 블록에 대한 결정을 내릴 때 catch 블록에 몇 번 충돌했는지 고려해야합니다. 10,000 회 사용 중 1 회만 사용한 다음 사용하십시오. 그러나 양식이고 사용자가 양식을 50 % 올바르게 채우지 않으면 try / catch 블록을 실행하지 마십시오.

예외 발생 가능성이 높은 곳에서는 예외 발생 if {} else {}을 피하기 위해 블록을 사용하는 것이 좋습니다 . 예를 들어, 쓰기 대신 두 숫자를 나누려는 경우 :

try
{
    int result = a/b;
}
catch (DivisionByZeroException ex)
{
    // Showing a message here, and logging of course.
}

당신은 작성해야합니다 :

if (b == 0)
{
    int result = a/b;
}
else
{
    // Showing a message to user to change the value of b, etc.
}

2
if / else를 사용하여 기본적으로 응용 프로그램 논리 인 "예외"를 처리하는 데 +1
Morgan Herlocker

사용자와 관련이 있다면 컴퓨터는 사람보다 훨씬 빠릅니다. 양식 제출의 50 %에서 예외가 발생하더라도 많은 사용자가 있어도 1 초에 몇 번만 발생할 수 있습니다.
Donal Fellows

1
try / catch 블록을 피하는 것에 동의하지 않습니다. 지속적으로 예외를 예상하는 것은 오류가 발생하기 쉽고 개발자 시간이 비싸며 코드를 읽기 어렵게 만듭니다. 백만 개의 예외 를 throw 하고 포착 하는 루프는 내 컴퓨터에서 500ms가 걸리고 (빈 루프의 경우 1ms), 99.99 %의 사례 (및 모든 UI 코드)에서 실제 성능 차이는 아닙니다. 성능 저하 문제를 알고있는 경우를 제외하고는 예외를 사용해야합니다. 코드의 안정성을 높이고 이전 코드가 성공적으로 실행되었다고 가정 할 수 있기 때문입니다.
Kaypro II

@ cosmic.osmo, 당신은 스택 트레이스를 검색하거나 잡아?

3

적절한 경우 try-catch를 사용해야하지만, 모든 예외를 포착하지 말고 기록하지 마십시오. 그 시점에서 그것은 코드 냄새와 거친 작업입니다.


1
로깅 +1 야생의 프로그램은 블랙 박스입니다. 그들이 실패하면, "여기에 무슨 일이 있었는지"라는 로그가 문제를 해결하는 데 먼 길을갑니다. 보고되지 않은 프로그램에 오류가 있었고 로그에서 찾은 후에 만 ​​발견되었습니다.
Andrew Neely

2

나는 개인적으로 예외를 참을 수 없어, 아주, 아주, 아주 정확하게 처리하기가 어렵습니다. 그리고 손상된 데이터를 손상시키지 않는 것은 매우 어렵습니다.

http://blogs.msdn.com/b/mgrier/archive/2004/02/18/75324.aspx

http://blogs.msdn.com/b/oldnewthing/archive/2004/04/22/118161.aspx

http://blogs.msdn.com/b/oldnewthing/archive/2005/01/14/352949.aspx

http://www.joelonsoftware.com/items/2003/10/13.html

다음과 같은 모든 함수를 호출하지 않으면 :

try
{
    TrivialFunction();
}
catch(TypeAException)
{
    //MaybeFix
}
catch(TypeBException)
{
    //MaybeFix
}
catch(TypeCException)
{
    //NO FIX - CORRUPT DATA
}
catch(TypeDException)
{
    //NO FIX - UNKNOWN STATE
}
catch(OutOfMemoryException)
{
    //Try to fix this one! Destructors might allocate on their own ;)
}
catch(Exception)
{
    //Nothing to see here, move on, everything is OK ;)
}

모든 종료 지점에서 올바르게 정리할 수있는 방법이 없습니다. 예외는 어렵다!

예외에 대한 유일한 좋은 점은 예외를 포착하지 않으면 예기치 않은 동작으로 인해 앱이 중단된다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.