Como posso identificar de forma confiável um erro específico no PHP?

Por causa do desbloqueio do PHP unlink() não suportando exceções nativamente, estou fazendo uma function de wrapper para ele. Ele deveria lançar FileNotFoundException se, bem, o arquivo fornecido não pudesse ser excluído porque não existe.

Para isso, eu preciso determinar se o erro lançado por unlink() foi causado por um arquivo ausente ou outra coisa.

Esta é a minha versão de teste para uma function de exclusão personalizada:

 public function deleteFile($path){ set_error_handler(function($errLevel, $errString){ debug($errLevel); debug($errString); }); unlink($path); restore_error_handler(); } 

Por $errLevel e $errString , recebo 2 (E_WARNING) e desassociar (/ tmp / fooNonExisting): Nenhum arquivo ou diretório

Uma abordagem bastante ousada seria assim:

 if( strpos($errString, 'No such file or directory') !== false ) { throw new FileNotFoundException(); }; 

Pergunta 1: Quanto posso confiar na cadeia de erro sendo a mesma em diferentes versões do PHP? Pergunta 2: Existe uma maneira muito melhor?

Eu simplificaria o código:

 public function deleteFile($path){ if (!file_exists($path) { throw new FileNotFoundException(); }else{ unlink($path); } if (file_exists($path) { throw new FileNotDeleted(); } } 

Então você não precisa pegar o $errstr e fazer um erro complicado. E funcionará para o PHP 4 quando as exceções foram introduzidas.

Ao ler as minhas perguntas ErrorException , ErrorException o ErrorException , combinado com set_error_handler() este seria um transformador automático de erro para exceção para todos os erros nativos do PHP:

 function exception_error_handler($errno, $errstr, $errfile, $errline ) { throw new ErrorException($errstr, 0, $errno, $errfile, $errline); } set_error_handler("exception_error_handler"); /* Trigger exception */ unlink('Does not exitsts'); 

Alguém pode prof?

Eu acredito que ele (ou seja, seu código) deve ser portátil o suficiente como é … No que diz respeito a uma maneira melhor de alcançar o mesmo, eu faria as coisas de forma diferente (embora o código seja simples, também é mais legível … então perca comigo)

 function deleteFile($file_path){ if(!is_file($file_path)){ throw new Exception("The path does not seem to point to a valid file"); } if(!file_exists($file_path)){ throw new Exception("File not found!"); } if(unlink($file_path)){ return true; } else { throw new Exception("File deletion failed!"); } } 

Claro que você sempre pode comprimir e melhorar o código … hop, isso ajuda!

Eu vi mensagens de erro php mudar um pouco ao longo dos anos. Talvez, tente detectar uma alteração no último erro sobre um pedaço de código muito granulado e, em seguida, resulte na análise de cordas em uma mansão muito solta.

 $lastErr = error_get_last(); unlink($file); if ($lastErr !== error_get_last()) { // do something //maybe string parsing and/or testing with file_exists, is_writable etc... }