2013-04-11 3 views
1

Я сейчас работаю в PHP. Я работаю над системой ошибок для моей CMS, которую я создаю (для удовольствия). Для фатальных ошибок в моей системе (не в компиляторе php) я создал класс FatalException, который расширяет встроенный класс Exception. Так как эти типы ошибок, во всяком случае, останавливают систему, я выбрал выход в __construct.Это плохое программирование, чтобы просто бросать исключения, а не в блок catch try?

class FatalException extends Exception{ 
     public function __construct($message) { 
      exit("<h1 style='color:red;' >FATAL ERROR: $message </h1>"); 
     } 
    } 

Так что в моем коде, я кое-что проверить, как подключение к базе данных, и если он не может, то я буду просто бросить FatalException («Не удается подключиться к базе данных: $ database_error_message»). Он не будет в блоке try/catch.

Когда я запускаю код и не могу подключиться к базе данных, например, все, что я вижу на экране, - это предложение с большими красными буквами. Так что все работает отлично, но это плохая практика/кодирование?

EDIT:

На самом деле на самом деле это не начать этот путь. Сначала я регистрировал ошибку, а затем выходил из области catch, но потом я подумал, что если все фатальные ошибки выйдут в любом случае, тогда просто добавьте конструктор in. Тогда я заметил, что на самом деле он не попал в зону улова, которую он покидал. Так положить заявление в Try/поймать блок был видом спорного вопроса. Это приводит к вопросу.

ответ

2

Даже вы обертываете exit() в функцию-член исключения, вы здесь не используете исключение для обработки ошибок, но только exit() - исключение никогда не бросается, PHP останавливается до этого.

Таким образом, это работает отлично, но это плохая практика/кодирование?

Да, это плохая практика. Он также работает просто отлично, если бы вы создали себе функцию:

function error_exit($message) { 
    exit("<h1 style='color:red;' >FATAL ERROR: $message </h1>"); 
} 

Вместо думать о том, хотите ли вы использовать Excpetions или вы хотите exit().

+0

Вы единственный, кто действительно ответил на вопрос. Я все равно собирался заменить исключение на выход, но мне было просто интересно. –

+0

Заменить исключение на функцию, которая содержит 'exit()' first. Потому что позже вы также захотите заменить 'exit()'. Часть неудачной практики - 99% 'exit()' в конце. Ваш код сейчас просто хаотичен. А также плохая практика, потому что она содержит 'exit()'. Обнаружить его в функции - это выход на данный момент. –

+0

Первое, что проверяет мой код, - это подключение к базе данных. Все, кроме файла config.ini, хранится в базе данных. Поэтому, если он не может подключиться к базе данных, нет необходимости загружать что-либо еще. Вывод простого не может подключиться к базе данных, это все, что мне действительно нужно. –

1

Это плохая идея imho. Для правильной работы необходимо убрать исключение. Однако вы можете создать такой метод, как -> error ($ index); который прикрепляется к каждому объекту, который вы делаете. Оттуда вы можете перенаправить ошибку в конкретный класс с блоком try/catch, чтобы правильно обрабатывать ошибки.

class TestClass 
{ 
    public function error($index) 
    { 
     try 
     { 
     // Convert index to exception and throw it. 
     } 
     catch (Exception $e) 
     { 
     // Handle the error 
     } 
    } 
} 
$a = new TestClass(); 
$a->error(1000); 

Обратите внимание, что это не работы за исключением, что PHP броски, вы должны поймать их по отдельности или работать с исполнительными концентраторов.

3

Если вы идете в exit() безоговорочно в конструкторе, на самом деле нет смысла указывать конструктор, не говоря уже о создании класса Exception. Вы могли бы проще (и честно) иметь статическую функцию, называемую Fatal::Die($message).

Дело исключений в том, что они описывают какого ошибки является (при наличии различных классов для различных исключений) и может быть пойман - даже если только для входа в файл и выручать программы.

Что делать, если конкретная страница вашего сайта может эффективно справиться без подключения к базе данных (просто отсутствует «последние новости» или что-то в этом роде)? Затем он мог бы catch(Database_Exception $e) и продолжить, пока остальная часть вашего сайта просто попадает прямо в сообщение «oh no something wrong wrong».

Сообщение с большими красными буквами также не является отличным механизмом обработки ошибок для чего-либо, кроме кого-либо, кроме вас, - либо они видят технические детали ошибки, когда вы не смотрите, я знаю, что пошло не так, потому что вы спрятали эту ошибку.

+0

Показание сообщения большими красными буквами должно было быть похоже на Wordpress «Невозможно подключиться к базе данных». Это показывает, не может ли он подключиться к базе данных. Поскольку все его настройки хранятся в базе данных. Сообщение об ошибке из базы данных допускается только для отображения, если ошибки отображения включены в файле config.ini, но пока я еще не получил этого. –

+0

@ChristopherWilson Моя точка зрения заключается в том, что отображение ошибки должно быть до ошибки * handler *, а не ошибка * производитель *: ваш код базы данных не должен даже знать, что он создает веб-страницу (это может быть обратный вызов AJAX) , С исключениями (или какой-то центральной функцией обработки ошибок) данные могут храниться в соответствующих полях объекта и соответствующим образом выводиться с помощью кода, который выполняется рендерингом. – IMSoP

+0

Кстати, Wordpress обычно не считается примером хорошей практики кодирования, особенно с точки зрения общей архитектуры. – IMSoP