회사 책임자는 Try-catch 문 내에서 모든 코드, 즉 모든 코드를 작성해야한다고 말합니다. 이제는 '죄송합니다.보다 안전합니다.'접근법을 이해할 수는 있지만 레이블을 만들 때 양식의 위치가 설정되면 예외가 있다고 생각하기에는 너무 마음에 들지 않습니다. 이러한 간단한 작업에서 예외가 발생한 경우가 있습니다.
회사 책임자는 Try-catch 문 내에서 모든 코드, 즉 모든 코드를 작성해야한다고 말합니다. 이제는 '죄송합니다.보다 안전합니다.'접근법을 이해할 수는 있지만 레이블을 만들 때 양식의 위치가 설정되면 예외가 있다고 생각하기에는 너무 마음에 들지 않습니다. 이러한 간단한 작업에서 예외가 발생한 경우가 있습니다.
답변:
회사 책임자는 Try-catch 문 내에서 모든 코드, 즉 모든 코드를 작성해야한다고 말합니다.
글쎄, 이것은 약간 과장되었으며 시끄러운 코드로 이어집니다. try catch 처리기로 작성된 모든 코드 (예 : 각 방법)의 이점은 무엇입니까? 대부분의 경우 수정해야 할 오류가 있음을 알려줍니다. 종종 예외는 처음부터 피할 수 있고 피해야합니다.
오류 추적 방법이 catch 자체를 수행하지 않더라도 스택 추적을 살펴보면 코드의 원인을 파악하기에 충분합니다. 개발자가 예외로 스택 추적을 손상시키는 경우가 있지만 많은 예외 처리기가있는 경우가 훨씬 더 흔합니다. 무엇이든 : 약간은 좋지만 너무 많은 것은 독입니다.
예외 처리는 실제로 매우 간단합니다.
캐치 예외
당신이 그것에 대해 생각한다면, 가장 항상 발생하는 예외를 처리하기에 좋은 곳이 하나뿐입니다. 따라서 처리기는 그 자리에 있어야합니다.
많은 예외는 처음부터 발생해서는 안되므로 예외 처리를 중심으로 제어 구조를 구축하지 말고 가능한 경우 언제 어디서나 예외가 발생하지 않도록하십시오.
상황이 (복구 불가능하게) 잘못되면 일찍 충돌하는 것을 잊지 마십시오. try-catch 문에 모든 코드를 넣는 것은 터무니 없지만 모든 예외를보고하고 기록하는 것을 잊지 마십시오.
그러나 레이블을 만들 때 폼의 위치가 설정되면 예외가 있다고 생각하기에는 너무 마음이 아프지 않습니다. 이러한 간단한 작업에서 예외가 발생한 경우가 있습니다.
확실히 맞아요! 항상 예측하지 못한 일이 잘못 될 수있는 방법이 있습니다. "치킨 마음"은 이러한 맥락에서 사용하기에 어리석은 표현입니다. 소프트웨어 개발은 잠재적 인 문제를 무시함으로써 당신의 마키스 모를 증명하는 것이 아닙니다.
무엇 이다 올바른 질문을하는 것은 그것의 여부 유용한 예외가 귀하의 코딩 표준들이해야 할 말 시점에서 잡힐 때까지. 당신의 진술은 모든 메소드 본문 주위에 try / catch 블록을 가지고 있어야한다고 읽습니다. 실제로 예외적으로 유용한 것을 즉시 할 수 없기 때문에 실제로 터무니 없습니다. 실제로 예외의 요점입니다. 적절한 시점에 처리 할 콜 스택을 전파하십시오.
나는 이것을 다른 방향으로 돌릴 것입니다. 예, 일반적으로 예외 처리는 좋은 일이지만 실제로 가능한 모든 예외를 잡는 시점에서 현명한 방식으로 처리 할 수 있습니까? 때로는 미션 크리티컬 한 소프트웨어를 작성하지 않는 경우 상황이 끔찍하게 잘못 될 경우 중간에 제어되는 방식으로 충돌하거나 태우는 것이 좋습니다.
잡힐 수있는 모든 단일 예외를 처리 할 수 있다고 100 % 확신 할 수 없다면 프로그램의 기본 루프를 래핑하여 일반적인 예외 처리기를 작성하는 것이 좋습니다. 작업중인 언어에 따라 달라집니다. 예외에 대해 최대한 상세하게 기록하고, 프로그램 상태를 저장하십시오 (현재 사용자가 작업중인 데이터 저장소가 아닌 다른 곳 -이 시점에서 모두 손상 될 수 있음을 기억하십시오) ), 등등. 그런 다음 예외를 다시 발생시키고 OS가 적절하게 처리하도록하십시오. 이 모든 예외 처리기에서 치명적인 오류에 대비하십시오.. 그런 다음 프로그램이 다시 시작될 때이 상태가 유용한 지 확인하고 복구 가능한 경우 복구 할 수있는 항목을 복원하십시오. 사용자에게 버그 보고서를 다시 보내도록 제안 할 수도 있습니다.
catch 블록은 리소스 측면에서 너무 비싸기 때문에 try / catch를 많이 사용하면 전체적으로 사용되지 않습니다. 시험 사용은 위험 관리를 상기시킵니다 . 위험 관리에는 두 가지 차원이 있습니다.
이제 집을 나가면 피아노가 머리 어딘가에 떨어지면 일어날 가능성은 적지 만 (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.
}
적절한 경우 try-catch를 사용해야하지만, 모든 예외를 포착하지 말고 기록하지 마십시오. 그 시점에서 그것은 코드 냄새와 거친 작업입니다.
나는 개인적으로 예외를 참을 수 없어, 아주, 아주, 아주 정확하게 처리하기가 어렵습니다. 그리고 손상된 데이터를 손상시키지 않는 것은 매우 어렵습니다.
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 ;)
}
모든 종료 지점에서 올바르게 정리할 수있는 방법이 없습니다. 예외는 어렵다!
예외에 대한 유일한 좋은 점은 예외를 포착하지 않으면 예기치 않은 동작으로 인해 앱이 중단된다는 것입니다.