2012-05-15 13 views
5

Sto lavorando con un'applicazione php e c'è una linea che sposta un file. Ho incluso il metodo all'interno di un try ... catch block così, se viene generato un errore, è possibile gestire un sistema di rollback. Ma l'eccezione non viene mai catturata, quindi, i nomi rinvia qualsiasi tipo di eccezione? Devo provare con un altro metodo?PHP rename() non genera eccezioni per errore

Grazie

Codice sopra:

try{ 
    if(rename($archivo_salida, $ruta_archivos)){ 
    //anything; 
    } 

}catch (Exception $e) 
    //do something 
} 

risposta

6

Le funzioni PHP "normali" non generano eccezioni.

modificare il codice per simulare un'eccezione:

try{ 
    if(rename($archivo_salida, $ruta_archivos)){ 
     //anything; 
    } else { 
     throw new Exception('Can not rename file'.$archivo_salida); 
    } 
}catch (Exception $e) 
    //do something 
} 
+0

il mio male. Grazie! – Cheluis

+0

Potrebbe esserci un trasformatore automatico Error to Exception: http://stackoverflow.com/a/10919969/22470 – powtac

2

Restituisce FALSE in caso di fallimento. Vedi http://php.net/manual/en/function.rename.php

Se si ha realmente bisogno di una generazione di un'eccezione quando la ridenominazione non riesce, si può fare questo:

if (rename($archivo_salida, $ruta_archivos)) { 
    // anything; 
} else { 
    throw new Exception("Rename failed."); 
} 

Ora, si può avvolgere questo intorno a un blocco try {} catch {} dove mai si invoca questo codice.

+0

grazie! uguale a una risposta ma grazie – Cheluis

0

È inoltre possibile utilizzare lo stesso approccio come descritto in questa risposta: https://stackoverflow.com/a/43364340/563049

Creare una classe di eccezione personalizzata e utilizzare è il metodo costruttore statico con or operatore dopo rename().

classe

Eccezione:

class CustomException extends Exception { 
    static public function doThrow($message = "", $code = 0, Exception $previous = null) { 
    throw new Exception($message, $code, $previous); 
    } 
} 

Usage:

try { 

    rename($archivo_salida, $ruta_archivos) or CustomException::doThrow('Renaming failed.'); 

} catch (Exception $e){ 
    //do something 
} 

Nota

Se si utilizza PHP 7 e più alto - è possibile rinominare metodo statico doThrow() semplicemente throw() , poiché in PHP 7 e versioni successive è consentito l'uso parole chiave riservate come nomi di metodi.