Обработка ошибок
Хочу вылить на бумагу свои рассуждения.
Сумбур в голове. Хочется, во-первых, изложить, а, во-вторых, послушать умных людей.
Сначала сформулируем несколько исходных положений.
1. Ситуацию, когда сайт в случае критической ошибки выдает невразумительную строчку на белом фоне (или на обрывках "дизайна"), можно считать приемлемой, если сайт изначально делается для небольшого круга друзей, которые быстро наберут на мобилу и до исправления потерпят.
В остальных случаях мы высказываем желание показать пользователю полностью оформленную страницу с извинениями.
2. Для этого мы делим наш скрипт функционально на две части. получение данных и отдача данных. Отдача начинается только после получения, которое завершилось успешно.
Для достижения этого мы,
1. В процессе получения данных мы вставляем разные проверки на ошибки. При этом, исходя из постулированных задач, реально нам нужна только последняя в цепочке(-ах). Такой метод назовем "грязным": ведь если не произошло подключение, условно, к БД, то остальной код гарантированно будет выдавать кучу ошибок, не имеющих, при этом, смысла. Большой беды в этом нет, но хочется красоты. Поэтому.
2. Хочется вставлять проверки выполнения критических операций, чтобы не плодить лишнего мусора в логах.
3. Исходя из постулированных задач, мы не применяем exit. Учше, он же die() - бяка и проклят во веки веков.
4. Попытавшись оформить if-ами задачу чуть более сложную, чем один запрос к одной таблице, понимаем, что mission impossible
5. Тут там рассказывают об исключениях, в которых throw - это и есть маленький локальный exit внутри блока try.
Вопросы.
1. В самом примитивном варианте использования try сведется к catch, в котором будет единственный оператор show_error_page(). Но. Если все только ради этой функции, то никто не мешает нам сделать вместо die функцимю petit_mort(), в которой будет тот же самый show_error_page()! получается, что exit не так уж ужасен, а try - не стакан c граалем.
2. Самый сложный вопрос. Разумеется, область применения исключениев не ограничивается единственным тупым траем на блок получения данных. Вот хочется осмысленных примеров другого применения траев.
3. Самый похожий на вопрос. Так ли уж нужен "чистый" стиль обработки?
Для предметности возьмем тестовый пример: создание файла дампа БД с последующей выдачей файла на экран.
При "грязном" стиле все просто, кроме факта определения успешности. Впрочем, пустой файл дампа вполне годится. получается, нигде не пишем никаких проверок кроме как перед самой выдачей.
в случае, если не откроется файл на запись, мы получим в логе длинную бороду ошибок записи.
с исключениями будет так (поправьте, если неправ):
В логах сообщение только о ключевой ошибке
результат тот же.
за что вы проголосуете, и почему?
Все это умозрительные построения и приглашение к обсуждению.
Хочу вылить на бумагу свои рассуждения.
Сумбур в голове. Хочется, во-первых, изложить, а, во-вторых, послушать умных людей.
Сначала сформулируем несколько исходных положений.
1. Ситуацию, когда сайт в случае критической ошибки выдает невразумительную строчку на белом фоне (или на обрывках "дизайна"), можно считать приемлемой, если сайт изначально делается для небольшого круга друзей, которые быстро наберут на мобилу и до исправления потерпят.
В остальных случаях мы высказываем желание показать пользователю полностью оформленную страницу с извинениями.
2. Для этого мы делим наш скрипт функционально на две части. получение данных и отдача данных. Отдача начинается только после получения, которое завершилось успешно.
Для достижения этого мы,
1. В процессе получения данных мы вставляем разные проверки на ошибки. При этом, исходя из постулированных задач, реально нам нужна только последняя в цепочке(-ах). Такой метод назовем "грязным": ведь если не произошло подключение, условно, к БД, то остальной код гарантированно будет выдавать кучу ошибок, не имеющих, при этом, смысла. Большой беды в этом нет, но хочется красоты. Поэтому.
2. Хочется вставлять проверки выполнения критических операций, чтобы не плодить лишнего мусора в логах.
3. Исходя из постулированных задач, мы не применяем exit. Учше, он же die() - бяка и проклят во веки веков.
4. Попытавшись оформить if-ами задачу чуть более сложную, чем один запрос к одной таблице, понимаем, что mission impossible
5. Тут там рассказывают об исключениях, в которых throw - это и есть маленький локальный exit внутри блока try.
Вопросы.
1. В самом примитивном варианте использования try сведется к catch, в котором будет единственный оператор show_error_page(). Но. Если все только ради этой функции, то никто не мешает нам сделать вместо die функцимю petit_mort(), в которой будет тот же самый show_error_page()! получается, что exit не так уж ужасен, а try - не стакан c граалем.
2. Самый сложный вопрос. Разумеется, область применения исключениев не ограничивается единственным тупым траем на блок получения данных. Вот хочется осмысленных примеров другого применения траев.
3. Самый похожий на вопрос. Так ли уж нужен "чистый" стиль обработки?
Для предметности возьмем тестовый пример: создание файла дампа БД с последующей выдачей файла на экран.
При "грязном" стиле все просто, кроме факта определения успешности. Впрочем, пустой файл дампа вполне годится. получается, нигде не пишем никаких проверок кроме как перед самой выдачей.
PHP:
mysql_connect();
mysql_select_db();
$fp=fopen();
mysql_query();
while ($row=mysql_fwtch_array) {
fwrite()
}
fclose();
$content=file_get_contents($filename);
if (!$content) $content = "I am sorry";
load_template();
с исключениями будет так (поправьте, если неправ):
PHP:
try {
mysql_connect() or throw new Exception('db_connect');
mysql_select_db() or throw new Exception('db_select');
$fp=fopen() or throw new Exception('fopen');
mysql_query() or throw new Exception('query'. mysql_error());
while ($row=mysql_fetch_array) {
fwrite()
}
fclose();
$content=file_get_contents($filename) or throw new Exception('fread');
} catch (Exception $e) {
$content = "I am sorry";
load_template();
}
load_template();
PHP:
function petit_mort() {
$content = "I am sorry";
load_template();
exit;
}
mysql_connect() or petit_mort('db_connect');
mysql_select_db() or petit_mort('db_select');
$fp=fopen() or petit_mort('fopen');
mysql_query() or petit_mort('query'. mysql_error());
while ($row=mysql_fetch_array) {
fwrite()
}
fclose();
$content=file_get_contents($filename) or petit_mort('fread');
load_template();
за что вы проголосуете, и почему?
Все это умозрительные построения и приглашение к обсуждению.