이 편리한 작은 수업을 고려하십시오.
class FunkyFile {
private $path;
private $contents = null;
public function __construct($path) {
$this->setPath($path);
}
private function setPath($path) {
if( !is_file($path) || !is_readable($path) )
throw new \InvalidArgumentException("Hm, that's not a valid file!");
$this->path = realpath($path);
return $this;
}
public function getContents() {
if( is_null($this->contents) ) {
$this->contents = @file_get_contents( $this->path );
if($this->contents === false)
throw new \Exception("Hm, I can't read the file, for some reason!");
}
return $this->contents;
}
}
예외를 완벽하게 사용하는 것입니다. 에서 FunkyFile's
관점의 경로 중 하나가 유효하지 않은 경우, 또는 situtation를 해결하기 위해 할 수있는 절대적으로 아무것도 없다 file_get_contents
실패합니다. 정말 예외적 인 상황;)
그러나 코드 어딘가에서 잘못된 파일 경로를 발견했다는 것을 사용자에게 알 가치가 있습니까? 예를 들면 다음과 같습니다.
class Welcome extends Controller {
public function index() {
/**
* Ah, let's show user this file she asked for
*/
try {
$file = new File("HelloWorld.txt");
$contents = $file->getContents();
echo $contents;
} catch(\Exception $e) {
log($e->getMessage());
echo "Sorry, I'm having a bad day!";
}
}
}
사람들에게 당신이 나쁜 하루를 보내고 있다고 말하는 것 외에, 당신의 선택은 다음과 같습니다 :
폴백
정보를 얻는 다른 방법이 있습니까? 위의 간단한 예제에서는 가능성이 없지만 마스터 / 슬레이브 데이터베이스 스키마를 고려하십시오. 주인이 응답하지 않았을 수도 있지만, 아마도 아마도 노예가 아직 밖에있을 수도 있습니다 (또는 그 반대).
사용자의 잘못입니까?
사용자가 잘못된 입력을 제출 했습니까? 글쎄, 그녀에게 말해. 오류 메시지를 짖거나 오류 메시지를 양식과 함께 제공하여 올바른 경로를 입력 할 수 있습니다.
네 잘못이야?
그리고 당신에 의해, 나는 사용자 가 아닌 것을 의미 합니다. 따라서 잘못된 파일 경로를 입력하는 것부터 서버에 잘못되는 것까지 다양합니다. 엄밀히 말하면, 503 HTTP 오류가 발생했습니다 . 서비스를 사용할 수 없습니다. CI에는 show_404()
기능이 있으므로 쉽게 구축 할 수 있습니다 show_503()
.
충고 한마디, 당신은 불량 예외를 고려해야합니다. CodeIgniter는 복잡한 코드이므로 예외가 언제 발생하는지 알 수 없습니다. 마찬가지로 자신의 예외를 잊어 버릴 수 있으며 가장 안전한 옵션은 모든 예외 처리기를 catch하는 것입니다. PHP에서는 set_exception_handler로이를 수행 할 수 있습니다 .
function FunkyExceptionHandler($exception) {
if(ENVIRONMENT == "production") {
log($e->getMessage());
show_503();
} else {
echo "Uncaught exception: " , $exception->getMessage(), "\n";
}
}
set_exception_handler("FunkyExceptionHandler");
또한 set_error_handler 를 통해 불량 오류를 처리 할 수 있습니다 . 예외와 동일한 처리기를 작성하거나 모든 오류를 변환 ErrorException
하여 예외 처리기로 처리 할 수 있습니다.
function FunkyErrorHandler($errno, $errstr, $errfile, $errline) {
// will be caught by FunkyExceptionHandler if not handled
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("FunkyErrorHandler");