나는 n-tier 응용 프로그램에서 작업 중이며 내 프레젠테이션 계층에서만 try/catch를 수행하고 있습니다. 데이터 계층이나 비즈니스 계층에서 오류가 발생하면이 오류는 내 프레젠테이션 계층의 try/catch에서 캡처됩니다. 이게 좋은가요, 아니면 각 레이어의 모든 메소드를 잡으려고 노력해야합니까?try catch를 사용하는 n-layer
답변
당신은 모든 수준에서 피하고 싶은 내용은 다음과 같습니다 모두가 같이 방법의 무리 :
void method()
{
try
{
// some code here that may potentially throw an exception
}
catch (/* anything here */)
{
// code right here to handle that exception
}
}
그건 당신이있어 무엇 경우 VB에서 예전의 On Error Goto
시스템으로 돌아갈 수 있습니다. 아무 것도 얻지 못했기 때문입니다. 예외는 오류 처리에 두 가지 주요 이점을 제공합니다. 서로 다른 유형의 오류를 다양한 방식으로 쉽게 처리 할 수있는 기능과 오류가 프로그램의 호출 스택에서 더 많이 발견 될 수있는 기능입니다. 여기에서 두 번째 이점이 있습니다.
우리는 예외가있는 이유의 큰 부분이기 때문에 상위 레이어로 예외를 "버블 업 (bubble up)"하도록하고 싶습니다.하지만 항상 프리젠 테이션 레이어에서 예외를 처리하고 싶습니까? ? 아니, 더 잘할 수있어. 경우에 따라 데이터 영역의 특정 예외에 대응하는 방법에 대한 비즈니스 규칙이있을 수 있습니다. 때로는 데이터 레이어 자체가 그 위의 레이어에 경고하지 않고 예외를 처리하고 복구 할 수 있습니다.
반면에 예외의 장점은 오류 처리 코드에 대한 프로그램 실행의 정상적인 흐름에서 더 적은 수의 중단으로 더 낮은 계층에 간단한 코드를 작성할 수 있다는 것입니다. 이는 프레젠테이션 계층에 더 많은 try/catch를 배치하는 대신에 발생합니다. 다시 말하지만, 프레젠테이션 계층이 프레젠테이션 계층을 처리 할 수있는 유일한 곳이라는 의미는 아니지만 프레젠테이션 계층을 포착하지 못하도록하기위한 노력입니다. 다른 곳에서는 처리 할 수없는 경우 프레젠테이션 계층에서 해당 정보를 캐치하여 사용자에게 친숙한 방식으로 보여줄 수있는 방법이 필요합니다. 또한 동일한 메커니즘을 사용하여 예외를 기록하거나보고하면 응용 프로그램이 실패한 위치에 대한 좋은 측정 항목을 얻은 다음 해당 정보를 사용하여 응용 프로그램을 개선 할 수 있습니다.
마지막 도랑 예외 처리기 안에 있다는 점에 도달하면 응용 프로그램 종료를 고려할 수도 있습니다. 처리되지 않은 예외로 인해 프레젠테이션 계층을 통과하는 예기치 않은 일이 실제로 발생하는 경우 프로그램을 계속 실행하는 것이 좋지 않을 수 있음을 시사하는 올바른 생각이 있습니다. 그러나이 경우에도 예외를보고하고 가능한 한 정상적으로 충돌하려고합니다.
일반적으로 코드가 잠재적으로 문제를 수정/수정/대응할 수있는 곳에서 예외를 잡는 것이 좋습니다. 이 "무언가를"하는 것은 상황에 달려 있습니다. 예를 들어 실패한 서비스 계층 호출이있는 경우 서비스가 너무 바쁠 수 있으므로 호출을 다시 시도 할 수 있습니다. 반면에 스토어드 프로 시저가 손상된 경우 재 시도 횟수와 상관없이 데이터베이스에서 논리가 수정 될 때까지 손상됩니다.
로그 오류 만 남기고 싶다면 오류가 발생한 곳과 가까운 곳에서 오류를 잡는 것이 덜 유용합니다.
내가 작업 한 모든 프로젝트에는 응용 프로그램의 모든 레이어에 try-catch
개의 블록이있었습니다.
try-catch
에 대한 추론 (읽기 : 시간, 일, 주, 월 또는 작업의 몇 년 후) 일반적으로 생산성 증가를 디버깅하는 시스템이 아니라, 즉시 천천히 실패에 실패 할 때 말한다 Fail Fast의 개념입니다. 위로 직선 캐스트는 다음과 같이 (int)
를 사용하여 대
.NET Framework의 빠른 실패의 좋은 예 Convert.ToInt32()
의 사용이다 : SomeSettingString
은 다음 int
값으로 변환 할 수 있습니다
int? settingValue = Convert.ToInt32(SomeSettingString);
if(settingValue == null)
{
// Do something here
}
else
{
// Do something else here
}
경우 로 설정되고 Do something else
논리가 실행됩니다. 지금부터 1 년 후에 설정이 바뀌고 변환이 실패하기 때문에 null
이 반환됩니다. 갑자기 Do something here
로직이 실행되고 갑자기 발견 될 경우이 상태가 발생한다는 것을 알 수있는 디버깅 어드벤처입니다. 이와 같은 대부분의 문제는 DEV가 아닌 PRODUCTION에서만 발생하는 것으로 보입니다.
이제 같은 일을보고 있지만,이 같은 빠른 실패로하자 : 설정 문자열이 int
실패로 변환이 발생하는 즉시
try
{
int settingValue = (int)SomeSettingString;
}
catch(Exception ex)
{
// Fail fast and throw exception
throw new Exception("Fail fast");
}
이제 예외가 발생합니다.
참고 : 예외가 "먹는"빈 블록 catch
에 의해 실패 속도가 저하 될 수 있습니다. try
블록이 비어있는 경우 catch
블록은 피해야하며 예외적으로 "먹는"예외 시나리오가 발생합니다.
try
{
// Exception waiting to happen here
}
catch(Exception ex)
{
// Catch-all, because all exceptions derive from Exception class
// So this will eat exceptions and pretend like they never happened
}
- 1. Java에서 try-catch를 사용하는 방법?
- 2. Swift에서 try-catch를 사용하는 방법?
- 3. NSError 테스트 대신 Try/Catch를 사용하는 이유
- 4. 마침내 try/catch를 사용하는 것이 좋습니다?
- 5. PHP는 try catch를 포함합니다.
- 6. try/catch를 사용한 return 문
- 7. 언제 JavaScript에서 try/catch를 사용해야합니까?
- 8. 속성 내에서 try-catch를 사용합니까?
- 9. ()/Try-Catch를 사용하여 저장 /로드하기
- 10. try catch를 제거하는 방법은 무엇입니까?
- 11. 두 개의 try-catch를 사용합니까?
- 12. try catch를 사용하여 DataServiceRequestException에서 복구
- 13. PHP 웹 애플리케이션 try/catch를 사용할 때
- 14. try/catch를 사용하여 타사 함수를 확장하십시오.
- 15. Dynamics Axe 2012에서 try-catch를 사용하는 이상한 동작
- 16. .NET에서 흐름 제어를 위해 try-catch를 사용하는 것이 "좋지"않습니까?
- 17. PDO에서 try and catch를 사용하는 가장 좋은 방법은 무엇입니까
- 18. 워크 플로의 활동을 둘러 보려면 try catch를 사용하는 방법?
- 19. Visual Studio C++에서 try catch를 사용하는 방법?
- 20. NSManagedObjectContext 주위에 try-catch를 저장하면 도움이됩니까?
- 21. Java에서 try/catch를 단순화하기위한 접근 방법
- 22. try/catch를 사용하지 않고 오류를 catch하는 방법 또는 런타임에 try/catch를 사용하여 코드를 줄이는 방법은 무엇입니까?
- 23. Try and Catch를 사용하여 과거의 오류 이동
- 24. try catch 내부에서 try catch를 수행하는 가장 좋은 방법은 무엇입니까?
- 25. 배치 파일에 try catch를 적용하려고합니다 (try catch 대신)
- 26. MFC 애플리케이션에서 어디에서 최상위 try/catch를 넣을까요?
- 27. 간단한 방법으로 try-catch를 올바르게 사용하려면 어떻게해야합니까?
- 28. while 루프가 try-catch를 무시하는 동안
- 29. Try Catch를 사용하여 부울 값을 찾습니다.
- 30. 컨트롤러에서 try ... catch를 사용하지 않으려면 어떻게해야합니까?
오류가 발생해도 코드 실행을 계속할 수있는 위치에있을 때마다 예외를 처리합니다. – Servy