스택 클래스를 작성한다고 가정하십시오. 클래스에 예외 처리 코드를 넣지 않으면 다음과 같은 예외가 발생할 수 있습니다.
- ArrayIndexError-사용자가 빈 스택에서 팝을 시도 할 때 발생합니다.
- NullPtrException-구현의 버그로 인해 null 참조를 참조하려고했기 때문에 발생
예외 래핑에 대한 간단한 접근 방식은 이러한 두 예외를 모두 StackError 예외 클래스로 래핑하기로 결정할 수 있습니다. 그러나 이것은 예외를 래핑하는 요점을 실제로 놓칩니다. 개체가 하위 수준 예외를 throw하면 개체가 손상되었음을 의미합니다. 그러나 이것이 허용되는 한 가지 경우가 있습니다 : 객체가 실제로 파손 된 경우.
예외를 줄 바꿈하는 것은 개체가 정상적인 오류에 대해 적절한 예외를 제공해야한다는 것입니다. 빈 스택에서 팝할 때 스택은 ArrayIndexError가 아닌 StackEmpty를 발생시켜야합니다. 의도는 없는 개체 또는 코드가 파손 된 경우 다른 예외가 발생하지 않도록 할 수 있습니다.
우리가 정말로 피하고 싶은 것은 높은 수준의 객체를 통해 전달 된 낮은 수준의 예외를 포착하는 것입니다. 빈 스택에서 팝할 때 ArrayIndexError를 발생시키는 스택 클래스는 사소한 문제입니다. 실제로 해당 ArrayIndexError를 잡으면 심각한 문제가 있습니다. 낮은 수준의 오류를 전파하는 것은 훨씬 덜 심각한 죄입니다.
이것을 SQLException 예제로 다시 가져 오려면 왜 SQLException이 발생합니까? 한 가지 이유는 잘못된 쿼리를 전달하기 때문입니다. 그러나 데이터 액세스 계층이 잘못된 쿼리를 생성하는 경우 해당 쿼리가 손상됩니다. DataAccessFailure 예외에서 끊어진 부분을 다시 줄이려고 시도해서는 안됩니다.
그러나 데이터베이스 연결이 끊어져서 SQLException이 발생할 수도 있습니다. 그 시점에 대한 나의 전략은 마지막 방어 라인에서 예외를 포착하고 데이터베이스 연결이 끊어지고 종료되었다는 것을 사용자에게보고하는 것입니다. 응용 프로그램이 데이터베이스에 액세스 할 수 없으므로 실제로 수행 할 수있는 작업이 많지 않습니다.
코드가 어떻게 생겼는지 모르겠습니다. 그러나 모든 예외를 맹목적으로 더 높은 수준의 예외로 변환하는 것처럼 들립니다. 비교적 적은 수의 경우에만 그렇게해야합니다. 가장 낮은 수준의 예외는 코드의 버그를 나타냅니다. 잡기와 다시 포장하는 것은 비생산적입니다.