Ale*_*nch 5 php exception try-catch throw
我知道这很奇怪,但在我的代码中,我有开发模式错误和生产模式错误.这是我的功能:
private function error($message, $mysql_error = null){
if( DEVELOPMENT_MODE ){
$exp = new Exception();
$trace = $exp -> getTrace();
array_shift( $trace ); // removes this functions from trace
$data["Error Mg"] = $message;
$data["MySQL Er"] = ( is_null ( $mysql_error ) ) ? "" : $mysql_error;
array_unshift($trace, $data );
fkill( $trace ); // formats array and then dies
}
else{
throw new Exception ( $data );
}
}
Run Code Online (Sandbox Code Playgroud)
我在我的数据库类中编写了这个函数,这样如果发生错误,我不必提供检查我们是否处于开发模式!
所以我认为我可以将可重复使用的代码外部化.但是,因为我从这个函数抛出一个异常,我基本上只是使用一个函数,它将返回抛出的错误.在生产模式中相当无用.
每次我想使用它时我都必须这样做:
try{
$this -> error( "Invalid Link After Connect.", mysql_error () );
} catch ( Exception $exp ){
throw $exp;
}
Run Code Online (Sandbox Code Playgroud)
不仅如此
$this -> error( "Invalid Link After Connect.", mysql_error () );
Run Code Online (Sandbox Code Playgroud)
所以为了避免为我想要调用的每个错误函数写一个try ... catch块...有没有办法抛出异常2级?
dec*_*eze 15
异常将自动向上传递到调用链,直到达到最高级别.如果它没有被捕获,程序执行由于未捕获的异常而终止.异常的全部意义在于能够让错误冒出来.你不需要更加努力或做任何特别的事情来"把它扔掉2级",这就是它的定义.
Amb*_*ber 10
只需省略try/ catchblock.异常会自动向前传播,直到有东西捕获它们为止; 你不需要在调用堆栈的每个级别显式地重新抛出它们.
这个...
try{
$this -> error( "Invalid Link After Connect.", mysql_error () );
} catch ( Exception $exp ){
throw $exp;
}
Run Code Online (Sandbox Code Playgroud)
完全等同于:
$this -> error( "Invalid Link After Connect.", mysql_error () );
Run Code Online (Sandbox Code Playgroud)