2011-03-21 766 views

Respuesta

76

es necesario definir el controlador de errores personalizado como:

<?php 

set_error_handler('exceptions_error_handler'); 

function exceptions_error_handler($severity, $message, $filename, $lineno) { 
    if (error_reporting() == 0) { 
    return; 
    } 
    if (error_reporting() & $severity) { 
    throw new ErrorException($message, 0, $severity, $filename, $lineno); 
    } 
} 

$a[1] = 'jfksjfks'; 
try { 
     $b = $a[0]; 
} catch (Exception $e) { 
     echo "jsdlkjflsjfkjl"; 
} 
+0

Esto no funcionará si tiene desactivada la generación de informes de errores, como probablemente lo haría en producción. –

9
$a[1] = 'jfksjfks'; 
try { 
    $offset = 0; 
    if(isset($a[$offset])) 
    $b = $a[$offset]; 
    else 
    throw new Exception("Notice: Undefined offset: ".$offset); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 

O, sin la ineficiencia de crear una excepción muy temporal:

$a[1] = 'jfksjfks'; 
$offset = 0; 
if(isset($a[$offset])) 
    $b = $a[$offset]; 
else 
    echo "Notice: Undefined offset: ".$offset; 
+8

I sho También menciono que es terriblemente ineficiente crear una excepción solo para que pueda atraparla y usarla inmediatamente, especialmente cuando es más fácil poner ese 'eco 'en la cláusula' else'. Eso no quita mérito a su respuesta, pero pensé que era necesario señalarlo. – paxdiablo

+3

Eso es muy cierto, ¡no disfruté escribirlo pero basta su pregunta original! – Prisoner

+0

Me interesaría conocer la razón de ser de los votos negativos, los cuerpos. Esto me parece perfectamente bien. – paxdiablo

20

No se puede con un bloque try/catch, ya que es un error, no una excepción.

siempre trata de compensaciones antes de usarlos:

if(isset($a[ 0 ]) { $b = $a[ 0 ]; } 
+14

1. No es un error, sino un aviso 2. Podemos convertir avisos/advertencias/errores en excepciones – zerkms

7

Sé que es 2016, pero en caso de que alguien salga a este mensaje.

Puede utilizar el método array_key_exists($index, $array) para evitar la excepción.

$index = 99999; 
$array = [1,2,3,4,5,6]; 

if(!array_key_exists($index, $array)) 
{ 
    //Throw myCustomException; 
} 
+0

Mejor que "if (! $ Array [$ index])", gracias! – user180574

-3

estoy seguro de por qué el error de banda, pero puedo solucionar algunos ..

en html2pdf.class.php

sobre líneas de 2132:

//FIX: 
$ctop=$corr[$y][$x][2]<=count($sw)?$corr[$y][$x][2]:count($sw); 
$s = 0; for ($i=0; $i<$ctop; $i++) {$s+= array_key_exists($x+$i, $sw)? $sw[$x+$i]:0;} 

igual en la línea 2138:

//FIX: 

$ctop=$corr[$y][$x][2]<=count($sw)?$corr[$y][$x][2]:count($sw); 
for ($i=0; $i<$ctop; $i++) { 

el problema la ar ray $ sw no tiene una clave de $ corr [$ y] [$ x] [2] por lo que corrijo el bucle para conteo máximo ($ sw) para arreglar .. No sé si eso creará otro consecuense pero yo resolver mi problema y no tener más errores ...

Así que espero que te funcione ... !!! Beats Reguards

0

Normalmente, no se pueden detectar avisos con el bloque try-catch. ¡Pero puede convertir avisos en excepciones! Use esta forma:

function get_notice($output) 
{ 
    if (($noticeStartPoint = strpos($output, "<b>Notice</b>:")) !== false) { 
     $position = $noticeStartPoint; 
     for ($i = 0; $i < 3; $i++) 
      $position = strpos($output, "</b>", $position) + 1; 
     $noticeEndPoint = $position; 
     $noticeLength = $noticeEndPoint + 3 - $noticeStartPoint; 
     $noticeMessage = substr($output, $noticeStartPoint, $noticeLength); 
     throw new \Exception($noticeMessage); 
    } else 
     echo $output; 
} 

try { 
    ob_start(); 
    // Codes here 
    $codeOutput = ob_get_clean(); 
    get_notice($codeOutput); 
} catch (\Exception $exception) { 
    // Catch (notice also)! 
} 

Además, puede utilizar esta función para detectar advertencias. Simplemente cambie el nombre de la función por get_warning y cambie "<b>Notice</b>:" por "<b>Warning</b>:".

Nota: La función cogerá una salida inocente que contiene:

<b> Aviso </b >:

Pero para escapar de este problema, simplemente, cambiar a:

<b> Aviso: </b >

Cuestiones relacionadas