1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-24 15:32:36 +01:00
Files
archived-doc-es/reference/errorfunc/functions/set-error-handler.xml
2021-01-28 21:42:50 -05:00

374 lines
13 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 71c12b158398eec7f65644d489749230984d43f6 Maintainer: seros Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.set-error-handler" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>set_error_handler</refname>
<refpurpose>Establecer una función de gestión de errores definida por el usuario</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>mixed</type><methodname>set_error_handler</methodname>
<methodparam><type>callable</type><parameter>error_handler</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>error_types</parameter><initializer>E_ALL | E_STRICT</initializer></methodparam>
</methodsynopsis>
<para>
Establece una función de usuario (<parameter>error_handler</parameter>) para manejar
los errores de un script.
</para>
<para>
Esta función se puede usar para definir su propia forma de manejar los errores
en tiempo de ejecución, por ejemplo en aplicaciones en las que se necesita hacer
una limpieza de datos/archivos cuando ocurre un error crítico, o cuando se necesita
provocar un error bajo ciertas condiciones (usando
<function>trigger_error</function>).
</para>
<para>
Es importante recordar que el gestor de errores estándar de PHP es completamente
evitado por los tipos de errores especificados por <parameter>error_types</parameter>
a menos que la función de llamada de retorno devuelva &false;.
La configuración de <function>error_reporting</function> no tendrá efecto y su
gestor de errores será llamado de todas formas - aunque aún es capaz de leer
el valor actual de
<link linkend="ini.error-reporting">error_reporting</link> y actuar
de manera apropiada. En particular, observe que este valor será 0 si a la
sentencia que causó el error se le añadió al principio el
<link linkend="language.operators.errorcontrol">operador de control de errores @
</link>.
</para>
<para>
También observe que es su responsabilidad realizar un <function>die</function> si
fuera necesario. Si la función de gestión de errores devuelve, la ejecución del script
continuará con la siguiente sentencia después de la que causó el error.
</para>
<para>
Los siguientes tipos de errores no pueden ser manejados con una función definida por el
usuario: <constant>E_ERROR</constant>, <constant>E_PARSE</constant>,
<constant>E_CORE_ERROR</constant>, <constant>E_CORE_WARNING</constant>,
<constant>E_COMPILE_ERROR</constant>,
<constant>E_COMPILE_WARNING</constant>, y
la mayoría de <constant>E_STRICT</constant> ocasionados en el archivo desde donde
se llamó a <function>set_error_handler</function>.
</para>
<para>
Si sucede algún error antes de que el script sea ejecutado (p.ej. en la carga de archivos) el
gestor de errores personalizado no podrá ser llamado ya que no está registrado en ese
momento.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>error_handler</parameter></term>
<listitem>
<para>
Una llamada de retorno con la siguiente signatura.
Se podría pasar &null; en su lugar para reiniciar este gestor a su estado predeterminado.
También se puede proporcionar un nombre de una función, un array que contenga una
referencia a un objeto y un nombre de un método.
</para>
<para>
<methodsynopsis>
<type>bool</type><methodname><replaceable>handler</replaceable></methodname>
<methodparam><type>int</type><parameter>errno</parameter></methodparam>
<methodparam><type>string</type><parameter>errstr</parameter></methodparam>
<methodparam choice="opt"><type>string</type><parameter>errfile</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>errline</parameter></methodparam>
<methodparam choice="opt"><type>array</type><parameter>errcontext</parameter></methodparam>
</methodsynopsis>
<variablelist>
<varlistentry>
<term><parameter>errno</parameter></term>
<listitem>
<simpara>
El primer parámetro, <parameter>errno</parameter>, contiene el
nivel del error ocasionado, como un valor de tipo integer.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>errstr</parameter></term>
<listitem>
<simpara>
El segundo parámetro, <parameter>errstr</parameter>, contiene el
mensaje de error, como cadena.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>errfile</parameter></term>
<listitem>
<simpara>
El tercer parámetro es opcional, <parameter>errfile</parameter>,
que contiene el nombre de archivo que ocasionó el error, como cadena.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>errline</parameter></term>
<listitem>
<simpara>
El cuarto parámetro es opcional, <parameter>errline</parameter>,
que contiene el número de línea donde ocurrió el error, como valor de tipo integer.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>errcontext</parameter></term>
<listitem>
<simpara>
El quinto parámetro es opcional, <parameter>errcontext</parameter>,
el cuál es una matriz que apunta a la tabla de símbolos activa en el punto
donde ocurrió el error. En otras palabras, <parameter>errcontext</parameter>
contendrá una matriz con cada variable que existe en el ámbito donde
el error fue provocado.
El gestor de errores de usuario no debe modificar el contexto del error.
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
Si la función devuelve &false; se continúa con el gestor de errores normal.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>error_types</parameter></term>
<listitem>
<para>
Se puede usar para enmascarar la provocación de la
función <parameter>error_handler</parameter> al igual que la
configuración <link linkend="ini.error-reporting">error_reporting</link> ini
controla los errores que se muestran. Sin esta máscara establecida
<parameter>error_handler</parameter> será llamada para cada error
sin tener en cuenta la configuración de <link
linkend="ini.error-reporting">error_reporting</link>.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Devuelve una cadena que contiene el gestor de errores definido anteriormente (si lo hay). Si
se usa el gestor de errores interno se devuelve &null;. &null; también es devuelto
en caso de un error como una llamada de retorno no válida. Si el gestor de errores anterior
era un método de una clase, esta función devolverá una matriz indexada con los nombres de las
clases y métodos.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>5.5.0</entry>
<entry>
<parameter>error_handler</parameter> ahora acepta &null;.
</entry>
</row>
<row>
<entry>5.2.0</entry>
<entry>
El gestor de errores debe devolver &false; para rellenar
<varname>$php_errormsg</varname>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Manejo de errores con <function>set_error_handler</function> y <function>trigger_error</function></title>
<para>
El ejemplo de abajo muestra el manejo de excepciones internas mediante
la provocación de errores y tratándolos con una función definida por el usuario:
</para>
<programlisting role="php">
<![CDATA[
<?php
// función de gestión de errores
function miGestorDeErrores($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
// Este código de error no está incluido en error_reporting
return;
}
switch ($errno) {
case E_USER_ERROR:
echo "<b>Mi ERROR</b> [$errno] $errstr<br />\n";
echo " Error fatal en la línea $errline en el archivo $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Abortando...<br />\n";
exit(1);
break;
case E_USER_WARNING:
echo "<b>Mi WARNING</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
echo "<b>Mi NOTICE</b> [$errno] $errstr<br />\n";
break;
default:
echo "Tipo de error desconocido: [$errno] $errstr<br />\n";
break;
}
/* No ejecutar el gestor de errores interno de PHP */
return true;
}
// función para probar el manejo de errores
function scale_by_log($vect, $scale)
{
if (!is_numeric($scale) || $scale <= 0) {
trigger_error("log(x) para x <= 0 no está definido, usó: scale = $scale", E_USER_ERROR);
}
if (!is_array($vect)) {
trigger_error("Vector de entrada incorrecto, se esperaba una matriz de valores", E_USER_WARNING);
return null;
}
$temp = array();
foreach($vect as $pos => $valor) {
if (!is_numeric($valor)) {
trigger_error("El valor en la posición $pos no es un número, usando 0 (cero)", E_USER_NOTICE);
$valor = 0;
}
$temp[$pos] = log($scale) * $valor;
}
return $temp;
}
// establecer el gestro de errores definido por el usuario
$gestor_errores_antiguo = set_error_handler("miGestorDeErrores");
// provocar algunos errores, primero definimos una matriz mixta con un elemento no numérico
echo "vector a\n";
$a = array(2, 3, "foo", 5.5, 43.3, 21.11);
print_r($a);
// ahora generamos una segunda matriz
echo "----\nvector b - a notice (b = log(PI) * a)\n";
/* Value at position $pos is not a number, using 0 (zero) */
$b = scale_by_log($a, M_PI);
print_r($b);
// esto es un problema, pasamos una cadena en vez de una matriz
echo "----\nvector c - a warning\n";
/* Vector de entrada incorrecto, se esperaba una matriz de valores */
$c = scale_by_log("no array", 2.3);
var_dump($c); // NULL
// esto es un error crítico, log de cero o de un número negativo es indefinido
echo "----\nvector d - fatal error\n";
/* log(x) para x <= 0 no está definido, usó: scale = $scale */
$d = scale_by_log($a, -2.5);
var_dump($d); // Nunca se alcanza
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
vector a
Array
(
[0] => 2
[1] => 3
[2] => foo
[3] => 5.5
[4] => 43.3
[5] => 21.11
)
----
vector b - a notice (b = log(PI) * a)
<b>Mi NOTICE</b> [1024] El valor en la posición 2 no es un número, usando 0 (cero)<br />
Array
(
[0] => 2.2894597716988
[1] => 3.4341896575482
[2] => 0
[3] => 6.2960143721717
[4] => 49.566804057279
[5] => 24.165247890281
)
----
vector c - a warning
<b>Mi WARNING</b> [512] Vector de entrada incorrecto, se esperaba una matriz de valores<br />
NULL
----
vector d - fatal error
<b>Mi ERROR</b> [256] log(x) para x <= 0 no está definido, usó: scale = -2.5<br />
Error fatal en la línea 35 en el archivo trigger_error.php, PHP 5.2.1 (FreeBSD)<br />
Abortando...<br />
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><classname>ErrorException</classname></member>
<member><function>error_reporting</function></member>
<member><function>restore_error_handler</function></member>
<member><function>trigger_error</function></member>
<member><link linkend="errorfunc.constants">constantes de niveles de error</link></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->