Domanda

mkdir () funziona correttamente a questa domanda è più circa la cattura di un errore. Invece di stampare questo quando la directory esiste Vorrei solo averlo scrivere a un messaggio a me in un log personalizzato. Come faccio a creare questa eccezione.

Attenzione: mkdir () [function.mkdir]: file esiste

È stato utile?

Soluzione

  

Vorrei solo di averlo scrivere a un messaggio a me in un log personalizzato.

la soluzione è molto semplice. PHP ha già tutto per voi:

ini_set('display_errors',0);
ini_set('log_errors',1);
ini_set('error_log','/path/to/custom.log');

o stesse impostazioni del php.ini o .htaccess
Penso che sarebbe meglio che scrivere ogni possibile errore manuale

Se non si desidera che questo errore da registrare (come potrebbe non essere errore, ma parte della logica dell'applicazione), è possibile controllare la cartella esistenza prima

if (!file_exists($folder)) mkdir($folder);
else {/*take some appropriate action*/}

Altri suggerimenti

È possibile interrompere il messaggio di errore da visualizzare o da sopprimere i messaggi di errore a livello mondiale (in config o runtime) con il display_errors modificando o caso per caso anteponendo la chiamata di funzione con un @ caratteri. (Ad esempio @mkdir('...')).

È quindi possibile verificare con error_get_last al ritorno mkdir false.

Per la registrazione degli errori si applicano regole globali. È possibile registrare gli errori manualmente con error_log .

Per approfondimenti, consultare la sezione del manuale sulla Gestione degli errori .

Modifica:

Come suggerito nei commenti, un gestore di errore personalizzato è anche una possibile, forse più robusto (a seconda dell'implementazione), ma certamente più elegante, soluzione.

function err_handler($errno, $errstr) {
    // Ignore or log error here
}

set_error_handler('err_handler');

In questo modo, il messaggio di errore non sarà visualizzato, a meno che non esplicitamente echo esso. Si noti, però, quando si utilizza un error_get_last gestore degli errori personalizzato tornerà NULL.

È possibile riscrivere qualsiasi funzione chiamata di sistema con una classe come questa:

file: system.php     

namespace abc;

class System {

    const CAN_NOT_MAKE_DIRECTORY = 1;

    static public function makeDirectory($path) {
        $cmd = "mkdir " . $path;
        $output = \shell_exec($cmd . " 2>&1"); // system call
        if ($output != "") {
            throw new \Exception($output, System::CAN_NOT_MAKE_DIRECTORY);
        }
        return(\TRUE);
    }

}

Poi si può chiamare il metodo e intercetta l'eccezione:

file: index.php     

namespace abc;
require 'system.php';

try {
    System::makeDirectory($directoryName);
} catch (\Exception $e) {
    throw new \Exception($e->getMessage(), System::CAN_NOT_MAKE_DIRECTORY);
} 

Ora si può trattare tutti gli errori del sistema con il try {...} catch(...) {...} finally {...} normalmente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top