попробуйте поймать против, если еще в PDO и некоторые другие вещи - PullRequest
4 голосов
/ 16 апреля 2011

Я нашел следующий вопрос:

В чем преимущество использования try {} catch {} по сравнению с {} else {}

Если выможете добавить что-нибудь к этому, тогда, пожалуйста, сделайте, как я новичок в PDO, а также что это значит;

$dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

На веб-сайте MySQL написано «обеспечивает создание исключений, а не ошибок» но я не понимаю этого, может кто-нибудь, пожалуйста, уточните, пожалуйста.

Ответы [ 2 ]

4 голосов
/ 17 апреля 2011

Исключения можно отследить с помощью try / catch и это классы со свойствами, а процедурные ошибки не могут и не являются.Процедурные ошибки вместо этого обрабатываются встроенной обработкой ошибок PHP.

Вы можете наблюдать разницу в поведении, вручную вызывая их.

, чтобы выдать исключение:

throw new Exception();

для запускапроцедурная ошибка:

trigger_error($message, U_USER_ERROR);

Исключением является OO-способ обработки ошибок.Дополнительную информацию об исключениях можно найти здесь: http://php.net/manual/en/language.exceptions.php

1 голос
/ 17 апреля 2011

Ну, они очень похожи.В нативной обработке ошибок PHP вы можете выдавать свои собственные ошибки с помощью trigger_error($error, [$level]), а вы можете выдавать свои собственные исключения с помощью throw new MyException($error);вы можете установить обработчик ошибок по умолчанию с помощью set_error_handler(), который будет обрабатывать все ошибки PHP (кроме синтаксического анализа) по-своему, как вы можете установить обработчик исключений по умолчанию с помощью set_exception_handler().Собственные ошибки и исключения PHP автоматически каким-либо образом запускаются / генерируются: собственные ошибки PHP при компиляции сценария, исключения, если вы используете определенные элементы, такие как (PDO) или что-то в этом роде.

Теперь давайте попробуем один и тот же код с разными подходами: С собственными ошибками PHP вы можете делать такие вещи, как:

$db = new Database();
if ($db === NULL) { trigger_error("Cannot connect to the database", E_USER_ERROR); }

$result = $db->query("UPDATE charlieiscool SET iloveunicorns = 1 WHERE userid = 1");
if (!$result) { trigger_error("Error updating table", E_USER_ERROR); }

$file = 'log.php';
if (!file_exists($file) or !file_get_contents($file)) { trigger_error("$file not found", E_USER_ERROR); }
require($file);

Я думаю, что это действительно не нуждается в каких-либо объяснениях.Если возникает ошибка, весь сценарий пропускается, и вы видите ошибку.Больше нет ничего, что вы можете сделать;Вы можете установить E_USER_ERROR или E_USER_NOTICE или E_USER_WARNING и обрабатывать их по-разному, но у вас нет такого большого выбора.Теперь рассмотрим возможный подход ООП с блоками try{} catch() {}:

try {
    $db = new Database();
        if (!$db) { throw new DBEx("Cannot connect to the database"); }
    $result = $db->query("UPDATE charlieiscool SET iloveunicorns = 1 WHERE userid = 1");
        if (!$result) { throw new QueryEx("Query failed"); }
} catch (PDOException $e) {
    echo $e->getMessage();
} catch (DBEx $e) {
    $e->customFunction();
} catch (QueryEx) {
    $e->customFunctionForQuery();
}

try {
    $file = 'log.php';
    if (!file_exists($file) or !file_get_contents($file)) { throw new FileEx("$file does not exists"); }
    require($file);
} catch (FileEx) {
    $e->fileGenerate();
    $e->logError();
}

Основное отличие состоит в том, что если первый блок try{} выдает исключение, второй try{} будет выполнен любым способом.На самом деле, если выдается исключение, будет пропущена только остальная часть сценария внутри этого блока try{}.

Другое отличие (то, которое я люблю больше всего) состоит в том, что вы можете создать несколько классов (расширение сети *).1022 * или PDOException или другие) и настройте свое поведение по обработке ошибок.У вас есть неограниченные возможности для настройки ваших классов, добавления функций, редактирования уже существующих.Вы можете добавить определенную функцию (например, $e->fileGenerate();) и вызывать их внутри блока catch() {}, где это необходимо.

Также обратите внимание, что если вы хотите, чтобы весь сценарий останавливался в случае возникновения ошибки, это означает, что эта ошибканеобходимо trigger_error();вместо этого, если вы хотите, чтобы ошибка остановила только определенный блок кода, связанный с этой ошибкой, тогда пришло время попробовать и поймать.

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

Кстати PDO::setAttribute() измените значения и параметры по умолчанию в вашем обработчике базы данных.Например, вы можете изменить выборку по умолчанию (используется в PDOStatement::fetch()) с помощью $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);.

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...