gestión de errores excepción PHP

Los errores y excepciones

Errores y anomalías no son los mismos en PHP, que indican un problema con el código, y puede proporcionar un mensaje de error.

Puntos:

  • Error oportunidades surgen antes de lo anormal
  • De error se puede delegar a un proceso de tratamiento de errores global, algunos errores no se pueden recuperar, que hará que el guión de la parada
  • Anormal primera instanciación (clase de excepciones), a continuación, lanza, que puede ser capturado (try ... catch)
  • Anormal después de la captura pueden ser tratadas in situ, sin detener la secuencia de comandos (Cualquier excepción no detectada hace que el script de parada)

El uso de excepciones:

  • Iniciativa: frente a la situación irreparable (el contexto actual no saben cómo hacer frente a) iniciativa expulsado, entregó al proceso de usuario

    ej. la conexión de base de datos de tiempo de espera, el tipo de parámetro de entrada no cumple las condiciones.

    ej., y los componentes del marco son particularmente incapaces de determinar cómo manejar la condición anormal, por lo general produce una excepción, se hace referencia a usuarios específicos a tratar.

  • La defensa pasiva: predecir problemas potenciales, mitigar los efectos (probablemente para lanzar un código de excepción en el / bloque catch intento)

PHP 7 Nota :

En PHP 7, la mayoría de los errores son tan excepción de error es lanzado, puede ser capturado.

Si todavía no ser atrapado y no se registró un manejador de excepciones (por set_exception_handler () de registro), será de la manera tradicional (referirse a la versión PHP7 anterior): se registra como un error fatal (Fatal Error), puede ser set_error_handler procesamiento ().

clase de excepción

PHP excepciones incorporadas categorías:

SPL clase de excepción extendida (hereda de la clase Exception):

Tipo de fallo (PHP> = 7)

  • throwable
    • Error
      • ArithmeticError
        • DivisionByZeroError
      • AssertionError
      • Error de análisis
      • Error de tecleado
    • Excepción
      • ...

Nota: En PHP 7, errores y excepciones se heredan de Throwable, por lo que cuando capturado (try ... catch) pueden al mismo tiempo excepciones y errores de captura mediante la captura de Throwable a

try {
    // do something
} catch (\Throwable $e) {
    // log error or sth.
}

error

PHP puede desencadenar diferentes tipos de errores:

  • fatal Error
  • Tiempo de ejecución error
  • error de compilación
  • Errores de inicio
  • El usuario activa un error (raro)

Error del nivel de notificación

error_reporting(int $level);

PHP 5,3 y por encima de, el nivel de informe de errores predeterminado es E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(no mostrarán E_NOTICE , E_STRICT , E_DEPRECATED )

PHP nivel de error Manual Todo

Parte de la explicación nivel de error:

Nivel de error explicación propuesta
E_NOTICE tiempo de ejecución de notificación. Se indica que el guión encontrado puede manifestarse como un error, pero el script ejecuta dentro puede haber aviso similar. Uso durante el desarrollo, error en el código que pueda surgir será una advertencia, sino el tiempo de depuración
E_STRICT Habilitar PHP propuestos cambios en el código, el código tiene que garantizar la mejor interoperabilidad y la compatibilidad hacia adelante.
E_ALL no incluye E_STRICT, por lo que el defecto no está activada
Uso durante el desarrollo
E_DEPRECATED tiempo de ejecución de notificación. código será activado puede no funcionar en versiones futuras de advertencia. abierto

Informe de errores

Informe de errores de seguir el principio de

  • Para informar de un error
  • entorno de desarrollo para mostrar un error
  • entorno de producción para no pantalla de error (razones de seguridad)
  • entornos de desarrollo y de producción deben registrar los errores

Nota distinguir errores del informe y errores muestran la diferencia entre estos dos conceptos.

php.ini

entorno de desarrollo es el informe de errores recomendada

;显示错误
display_startup_errors = On
display_errors = On

; Reportar errores
error_reporting = - 1

; Error de grabación
log_errors = On

entorno de producción es el informe de errores recomendada

;显示错误
display_startup_errors = Off
display_errors = Off

; Informe de error
del error_reporting = E_ALL y ~ E_NOTICE

; Error de grabación
log_errors = On

Algunos parámetros que explican

parámetros explicación propuesta
display_errors información de error si se proporciona como parte de la salida a la pantalla o oculta para el usuario sin mostrar entorno de desarrollo se abre
un entorno de producción Asegúrese de apagar
display_startup_errors Incluso si display_errors está ajustado en ON, no se mostrarán mensajes de error durante el inicio de PHP. Se recomienda encarecidamente excepto para fines de depuración, los display_startup_errors desactivados. entorno de desarrollo se abre
un entorno de producción Asegúrese de apagar
log_errors Está configurado para ejecutar un mensaje de error de script se registra en el registro de errores del servidor o error_log en abierto

código de ejemplo

<?php
// 关闭所有PHP错误报告
error_reporting(0);
// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// 报告 E_NOTICE也挺好 (报告未初始化的变量
// 或者捕获变量名的错误拼写)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// 除了 E_NOTICE,报告其他所有错误
error_reporting(E_ALL ^ E_NOTICE);
// 报告所有 PHP 错误 (参见 changelog)
error_reporting(E_ALL);
// 报告所有 PHP 错误
error_reporting(-1);
// 和 error_reporting(E_ALL); 一样
ini_set('error_reporting', E_ALL);
?>

gestor de excepciones mundial

No se pierda toda excepción no detectada: por set_exception_handlergestor de excepciones mundial registrada.

función

set_exception_handler ( callable $exception_handler ) : callable
// 注册异常处理程序
set_exception_handler('handleException');
// 重置异常处理程序为默认值
// set_exception_handler(null);
// 还原成之前的异常处理程序
// restore_exception_handler();    
// < PHP 7
handleException(Exception $ex)
{
    // 记录错误日志
    echo "Uncaught exception: " , $ex->getMessage(), "\n";
    // 开发环境显示调试信息(推荐 filp/whoops 扩展包)
    // ...
    // 生产环境显示对用户友好的页面(信息)
    // ...
}
// >= PHP 7
// 大多数错误抛出 Error 异常, 也能被捕获, 因此参数类型必须是 Throwable, 否则会引起问题.
handleException(Throwable $ex)
{
    // ...
}

En el manejo de las funciones internas excepción definida por el usuario, puede hacer algo de procesamiento de acuerdo a la situación:

  • registro de errores
  • página web errores de renderizado
  • prestación de error de la consola

manejador de error global

Al establecer un controlador de errores global, utilizar su propia manera personalizada para interceptar errores y PHP proceso, incluyendo pero no limitado a:

  • registro de errores detallada Registro
  • Hacer limpieza de la recuperación de datos / archivo
  • ErrorException convierte en un objeto, y entonces el flujo de la excepción de procesamiento a errores del mango.

Inscribirse controlador de errores global

set_error_handler( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed

$error_typesEspecificar el tipo de error sería de intercepción el gestor de errores (a menos que la función devuelve false), no están error_report()afectados.

Handler

# 错误处理函数参数
# $errno 错误等级(对应 E_* 常量)
# $errstr 错误消息
# $errfile 发生错误的文件名
# $errline 发生错误的行号
# $errcontext 一个数组, 指向错误发生时可用的符号表(可选参数), 通常不用(php7.2后废弃)
function error_handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext) {
    // 处理错误
}

Cuando la declaración se prefija por @ se produce un error, $ errno es 0

  • La secuencia de comandos continúa desde el lugar equivocado en el final de la función de gestión de errores (y por lo tanto tiene que tomar la iniciativa de llamar, si es necesario, die()o exit()para poner fin a la secuencia de comandos)

  • Si se produce un error antes de la ejecución del script (como la carga de archivos) no se llama manipulador personalizado, ya que no se ha registrado en ese momento.
  • Si la función devuelve FALSO , programa de procesamiento de error estándar continuará llamada.

El tipo de error no puede ser capturado

Los siguientes niveles de error no pueden ser capturados por un controlador de error definido por el usuario:

Nivel de error explicación
E_ERROR errores de tiempo de ejecución fatales, generalmente irrecuperables (problemas, por ejemplo. Debido a la asignación de memoria)
E_PARSE errores de análisis en tiempo de compilación, generados por el analizador
E_CORE_ERROR PHP error fatal arranque inicial se produce durante generado por el núcleo motor php
E_CORE_WARNING advertencias arranque inicial de PHP (errores no fatales) que ocurren durante generado por el núcleo motor php
E_COMPILE_ERROR Los errores fatales en tiempo de compilación. Del mismo modo E_ERROR , pero es generado por el Zend motor de scripting.
E_COMPILE_WARNING Advertencias (errores no fatales) en tiempo de compilación. Del mismo modo E_WARNING , pero es generado por el Zend motor de scripting.

Y llamando  set_error_handler ()  La mayor parte del archivo en el que la función generada  E_STRICT .

Estos errores pueden no ser capturado, pueden ser register_shutdown_function()procesadas (pero el guión todavía terminarán)

código de ejemplo

function handleError($errno, $errstr, $errfile = '', $errline = 0)
{
    if (!(error_reporting() & $errno)) {
        // 错误类型未包含在 error_reporting() 里, 因此将它交由PHP标准错误处理程序来处理
        return false;
    }
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

El error se convierte en una excepción

Gestión de errores y excepciones entornos de desarrollo / producción

entorno de desarrollo

mensaje de error predeterminado php es muy mala, con el fin de ayudar mejor el depurador, puede utilizar filp / whoops paquete de expansión.

instalar

composer require filp/whoops

Uso (web)

$whoops = new \Whoops\Run;
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
$whoops->register();

Si los errores de PHP script php gatillo, o la aplicación no captura excepciones, el desarrollador puede ver un gráfico chillidos página de diagnóstico.

procesador disponible

  • PrettyPageHandler - hermosa pantalla de la página web muestra un mensaje de error
  • PlainTextHandler - mensaje de texto sin formato cuando un programa de línea de comandos
  • CallbackHandler - el cierre de los envases u otro gestor de llamadas
  • JsonResponseHandler - llama la cadena JSON excepción y rendimientos, tales como una petición de AJAX
  • XmlResponseHandler - detectar la excepción, pero regresó en la cadena de formato XML

entorno de producción

Grabación de información de error se suele utilizar error_log()la función para grabar el mensaje de error en el sistema de archivos o syslog.

error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] ) : bool

message_type parámetro de ajuste errores se deben enviar a dónde. Los posibles tipos de información son los siguientes:

0 messagePHP es enviado al registro del sistema, utilice el mecanismo de registro del sistema operativo o un archivo, dependiendo de las error_log conjuntos de directivas qué. Esta es la opción por defecto.
1 messageParámetro enviado a destinationlos ajustes de direcciones de correo. El cuarto parámetro extra_headerssólo será utilizada en este tipo allí.
2 Ya no es una opción.
3 messageSe envía a la ubicación para destinationel archivo. Carácter messageno por defecto debe ser tratada como una nueva línea.
4 message SAPI envía directamente a un controlador de registro.

Una mejor opción es utilizar monólogo / monólogo paquete extendido

<?php
require "vendor/autoload.php";
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
// add records to the log
$log->warning('Foo');
$log->error('Bar');

Ejemplo: Monólogo de registro en un entorno de producción, una notificación de correo de error grave

依赖: SwiftMailer / SwiftMailer

require "vendor/autoload.php";
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SwiftMailerHandler;
date_default_timezone_set('Asia/Shanghai');
// 设置monolog
$logger = new Logger('my-app-name');
$logger->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
// 添加SwiftMailer Handler, 遇到严重错误时使用邮件通知
// Create the Transport
$transport = (new Swift_SmtpTransport('smtp.example.org', 25))
  ->setUsername('your username')
  ->setPassword('your password');
// Create the Mailer using your created Transport
$mailer = new Swift_Mailer($transport);
// Create a message
$message = (new Swift_Message('Wonderful Subject'))
  ->setFrom(['[email protected]' => 'John Doe'])
  ->setTo(['[email protected]', '[email protected]' => 'A name']);
$logger->pushHandler(new SwiftMailerHandler($mailer, $message, Logger::CRITICAL));
// 使用日志记录器
$logger->critical('The server is on fire!');

la función de devolución de llamada php se aborta

register_shutdown_function

register_shutdown_function(function () {
    // do sth...
}, $para1, $param2, ...)

Un registro callback, se ejecutará la secuencia de comandos para completar o exit () después de la llamada.

Nota:

  • Puede registrar varias devoluciones de llamada (no sobrescribir el uno al otro, con el fin de llamar, de acuerdo con el orden de inscripción), cuando el script php se invoca para abortar.

  • Si se llama a los métodos internos registrada Salir () , entonces todo el proceso se aborta, y la suspensión de otras devoluciones de llamada registrados ya no se llama.

Como parte del error que no puede ser set_error_handlercapturado, y por lo tanto necesitan cooperar register_shutdown_function, para determinar la causa de las salidas de guión, ya que si no se detecta un error fatal, que tendrá que hacer frente a (registro, etc.)

register_shutdown_function('handleShutdown');
function handleShutdown()
{
    // 如果是因为严重错误(未被捕获)导致脚本退出, 则需要处理(作为对 set_error_handler的补充)
    if (! is_null($error = error_get_last()) && isFatal($error['type'])) {
        // handleException() 函数同时处理 set_exception_handler
        handleException(new \ErrorException(
            $error['message'], $error['type'], 0, $error['file'], $error['line'],
        ));
    }
}
function isFatal($type)
{
    // 以下错误无法被 set_error_handler 捕获: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING
    return in_array($type, [E_COMPILE_ERROR, E_CORE_ERROR, E_ERROR, E_PARSE]);
}

Nota:

Proceso de la función abortado no se llamará cuando la señal de SIGTERM o matar SIGKILL. Pueden pcntl_signalentonces la señal de captura en el que la llamada exit()de suspender normal.

Artículo reproducido de https://www.cnblogs.com/youjiaxing/p/10310658.html

Publicado 41 artículos originales · ganado elogios 21 · Vistas a 70000 +

Supongo que te gusta

Origin blog.csdn.net/u010324331/article/details/89565154
Recomendado
Clasificación