2012-01-09 2 views
3

예외를 많이 사용하지 않고 PHP에서 100 %를 파악하기가 힘들다는 것을 인정합니다. 이는 PHP에 가장 좋은 오류가 없기 때문에 부분적 일 수 있습니다 => 예외 지원 그러나 나는 그들에 대해 많이 알지 못합니다.여러 PHP 예외 클래스를 사용하는 이유

예를 들어 아래 코드를 예로 들면 기본 Exception 클래스를 확장하지만 아무것도 수행하지 않는 4 가지 클래스가 정의되어 있습니다. 나는 단지 왜 예외를 호출하지 않고 왜이 모든 클래스들을 가지고 있는지 궁금합니다.

충분한 이유가 있다고 가정합니까?

class OptimizeImageException extends Exception {}; 

class FileNotFoundException extends OptimizeImageException {}; 

class FileNotImageException extends OptimizeImageException {}; 

class ModuleNotFoundException extends OptimizeImageException {}; 
+0

내가 생각할 수있는 유일한 이유는 특수성입니다. 예외가 이름을 가지고 있다면 적어도 어쩌면 시작하기 시작할 때 어디에서 시작해야할지 알 것입니다. –

+0

@Jared Farrish : "표시가 시작될 때"- 예외 추적이있어서 정확히 어디에서 던져 졌는지 알 수 있습니다. 각 사례에 대해 특정 클래스가 있거나 없음 – zerkms

+0

@zerkms - 동의하는지 또는 동의하지 않는지 확실하지 않습니다. 나랑? –

답변

5

여러 예외 클래스를 가짐으로써, 당신은 당신이 그들을 잡는 경우에 관심이있는 한 개 선택할 수 있습니다.

<?php                  
class OptimizeImageException extends Exception {}; 

class FileNotFoundException extends OptimizeImageException {}; 

class FileNotImageException extends OptimizeImageException {}; 

class ModuleNotFoundException extends OptimizeImageException {}; 

try { 
    throw new FileNotImageException(); 
} catch (FileNotFoundException $x) { 
    echo "NOT FOUND!"; 
    // do something about it 
} catch (FileNotImageException $x) { 
    echo "NOT IMAGE!"; 
    // do something about it 
} catch (Exception $x) { 
    echo "UNKNOWN EXCEPTION!"; 
    // do something else about it 
} 

이 사소한 예이지만 이미지를로드하도록되어 기능 loadImage()을 말한다. 함수가 실패하면 다른 실패 시나리오를 다르게 처리 할 수 ​​있습니다. 항상 기본 Exception을 던지면 잘못된 점만 알게됩니다. 무엇이 잘못되었는지 알지 못하므로 다른 메커니즘을 사용하지 않고 다른 시나리오를 기반으로 다른 복구 대응책을 가질 수 없습니다.

2

을 찾으려면 다른 예외 클래스가 있어야합니다. 특정 예외를 처리 할 수있는 경우 실제로는이 발생했습니다.

처럼 : 당신은 하나의 특정 예외 경우를 처리하고 위의 코드에서

try { 
    // do something 
} catch (OptimizeImageException $e) { 
    // image cannot be optimized. left it as is and log the error message 
} 

, 예상대로 응용 프로그램의 흐름을 이동 지금 바로 여기 처리 할 수 ​​있습니다. 다른 가능한 예외가 더 커질 것입니다.

MyAppException과 같은 예외 클래스가 하나 뿐인 경우 실제로 잡힌 것을 확인하고 예외를 다시 처리 할 수없는 경우 메시지를 확인하면됩니다. 이 방법으로 볼 수 있듯이 코드는 약간 hackish하고 unmaintainable이 될 것입니다 (예외 메시지를 변경할 수 없습니다)

관련 문제