php, могут ли исключения быть сброшены на 2 уровня?

Я знаю, что это странно, но в моем коде есть ошибки в режиме разработки и ошибки режима производства. Это функция, которую я имею:

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 ); } } 

Я написал эту функцию в моем классе базы данных, поэтому, если произошла ошибка, мне не нужно предоставлять проверку, если мы находимся в режиме разработки или нет!

Поэтому я подумал, что смогу использовать внешний код повторно используемого кода. Однако, поскольку я выбрал исключение из этой функции, я в основном использую функцию, которая вернет возникшую ошибку. Довольно бесполезно в режиме производства.

Я должен был бы делать это каждый раз, когда захочу использовать его:

 try{ $this -> error( "Invalid Link After Connect.", mysql_error () ); } catch ( Exception $exp ){ throw $exp; } 

ОТКРЫТЬ, ЧЕМ ПРОСТО

 $this -> error( "Invalid Link After Connect.", mysql_error () ); 

поэтому, чтобы избежать написания try … catch block для каждой функции ошибки, которую я хочу вызвать … есть ли способ выбросить исключение 2 уровня вверх?

Исключение будет автоматически перемещаться по цепочке вызовов до достижения наивысшего уровня. Если он не пойман, выполнение программы завершается из-за неперехваченного исключения . Весь смысл исключений состоит в том, чтобы иметь возможность создавать ошибки. Вам не нужно бросать больше или делать что-то особенное, чтобы «выбросить его на 2 уровня», это то, что он делает по определению.

Просто опустите блок try / catch . Исключения автоматически распространяются до тех пор, пока что-то их не поймает; вам не нужно явно перебрасывать их на каждом уровне стека вызовов.

Эта…

 try{ $this -> error( "Invalid Link After Connect.", mysql_error () ); } catch ( Exception $exp ){ throw $exp; } 

в точности эквивалентен этому:

 $this -> error( "Invalid Link After Connect.", mysql_error () ); 

Использование нескольких блоков catch использует таблицу admin, которая имеет поле

 Mode Value 0 Production 1 Debug 

выполняется первый улов, который соответствует исключению

пример

  try { if (!$bDBConnection && $row['mode'] ==0 ) { throw new Produciton_DBException("Problem with Database"); } else { throw new Debug_DBException("Problem with Database"); } } catch(Produciton_DBException $e) { // display suitable error messages } catch(Debug_DBException $ex) { // Exception falls through until a match is found }