2010-04-30 3 views
3

Я действительно не уверен, что это правильный путь, поскольку исключения - это действительно свежий предмет для меня. Можно ли уловить несколько исключений (пусть выполнение сценария продолжается), а затем сохранить исключения в массиве, чтобы иметь возможность возвращать все вызванные исключения?Хранить PHP Исключения в массиве

По тем, что было бы удивительным, чтобы быть в состоянии использовать исключения для более чем просто показывает ошибку, которая убивает приложение (скрипт)

Спасибо!

ответ

11

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

Вы должны смотреть на исключения, явные как ошибку, которую вы не можете обработать в текущем коде/функции. Если вы можете решить проблему, нет необходимости бросать и обрабатывать исключение.
Не используйте его как механизм для обработки ожидаемого поведения.

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

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

По тем, что было бы удивительным, чтобы быть в состоянии использовать исключения для более чем просто показывает ошибку, которая убивает приложения (сценарий)

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

Для некоторых примеров синтаксиса см. W3Schools PHP Exception Handling. Большая статья об этой теме размещена на Devshed.

+0

Hi Echox! Спасибо за большой и обширный ответ. Есть ли у вас примеры использования Log4PHP для массива? Спасибо! – Industrial

+0

Зачем вам нужно хранить все в массиве? :-) Просто зарегистрируйте его в своей файловой системе или в таблице базы данных? Но если вам действительно нужно хранить свой «журнал» в массиве, просто используйте $ e-> getMessage(); и сохраните результирующую строку в массиве. См. «Несколько исключений и повторных исключений» в примерах W3Schools. – echox

+0

Привет! Я пытаюсь собрать несколько сообщений об ошибках/состояниях, созданных в результате цепного действия, чтобы отправить обратно пользователю вместе с результатом функции (true/false) – Industrial

6

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

Само название механизма указывает на то, что произошло что-то «исключительное», которое необходимо немедленно обработать.

2

Вы можете сделать больше с ними, чем просто убить сценарий, но Сан Хасинто прав, говоря, что не будет особенно хорошей практикой хранить их в массиве для обработки позже.

Может быть, вы должны иметь чтения этого (в том числе примеров, они будут полезны):

http://php.net/manual/en/language.exceptions.php

Это должен показать вам некоторые другие способы, которые вы можете использовать исключение, а не просто остановить выполнение.

Удачи вам!

1

Larry Wall пишет об этом в своей последней статье «Состояние лука». Каждый хочет иметь возможность взломать/ухватить фреймворк. По правде говоря, практика плохого кодирования заключается в том, чтобы просто полагаться на структуру, чтобы обрабатывать плохо проверенный код. Кроме того, это очень сложно отладить.

Мой совет должен был бы, вместо того, чтобы что-то вроде этого:

try { 
    $fh = fopen("foo.txt", 'r'); 
    if (!$fh) { 
     throw new Exception("foo.txt not found"); 
    } 
    # ... 
} catch (Exception $e) { 
    # report errors 
} 

Просто собрать их в буфере сообщений, как они происходят:

@errors = array(); 
if (! (is_file("foo.txt") && $fh = fopen("foo.txt", 'r'))) { 
    $errors []= "foo.txt not found"; 
} 
# ... 

Таким образом, ваш стек указатель ISN» t прыгая повсюду, пытаясь найти обработчик для Exception.

PHP пытается быть слишком похож на Java, ИМХО.

+4

Любое умеренно сложное приложение будет экспоненциально сложным с этим методом, если, конечно, вы не имеете в виду исключения, которые действительно не так уж плохи и на самом деле должны быть предупреждениями. Кэширование (не «ловить», а «кешировать»)) их легко; это связано с ними позже, что очень сложно. Частью проблемы является то, что вы потеряете большую часть состояния, которое было у вас, когда произошло исключение. Другой проблемой является вопрос КОГДА обрабатывать эти исключения. Я лично думаю, что ваш метод открывает банку червей. –

Смежные вопросы