PHP unlink() обработка исключения - программирование
Подтвердить что ты не робот

PHP unlink() обработка исключения

Ну, мне было интересно, могу ли я правильно обработать функцию unlink(). Я не хочу, чтобы функция unlink() выдавала какую-то неприятную ошибку, если она не может отсоединить файл (может быть, из-за отсутствия файла).

Я пробовал что-то вроде

try { 
    unlink("secret/secret.txt"); 
} catch(Exception $e) { 
    print "whoops!"; 
    //or even leaving it empty so nothing is displayed
} 

Но он не работает. Я не эксперт в PHP. Я искал и нашел этот код обработки исключений где-то в Интернете. Но, насколько я помню, мои школьные дни, то же самое использовалось для Java. Так должно было сработать. Я не знаю, что не так с кодом.

Или я могу просто использовать оператор if..else, например

if(unlink($file)){
  //leaving here empty must ensure that nothing is displayed
}else{
  //leaving here empty must ensure that nothing is displayed
}

Но этот код не работает. Где я делаю ошибку? Каковы другие способы правильного его решения?

Можно ли скрывать ошибки, манипулируя сообщением об ошибках (PHP) (среда разработки и разработки)?

4b9b3361

Ответ 1

unlink не генерирует исключений, генерирует ошибки. Правильный способ сделать это - проверить, существует ли файл, прежде чем пытаться вызвать unlink на нем. Если вас просто беспокоит отсутствие ошибок, вы должны просто отключить display_errors, который вы всегда должны делать в производственной среде. Затем они будут только зарегистрированы.

Не подавляйте ошибки с помощью @, его редко рекомендуется.

Можете ли вы более подробно описать @

Я не уверен, что вы имеете в виду. Но документация здесь. Что касается того, почему вы не хотите его использовать... Это потому, что вы никогда не знаете, что код не работает или проблематичен. Даже если код по-прежнему работает с функциональной точки зрения, у него все еще есть проблема, и эта проблема потенциально может сделать что-то еще совсем неработоспособным в какой-то момент. Если у вас никогда не было ошибки, вы, вероятно, потратите много времени на отладку.

Прекрасно менять уровень журнала или отключать отображение ошибок, но вы никогда не хотите полностью их подавлять.

Ответ 2

Если вы хотите только подавить ошибку, вы можете сделать это:

@unlink('your_file_name');

Как правило, в php @будет сжимать любую ошибку.

Лучший способ минимизировать вероятность ошибки. Вы говорите, что одна из возможностей ошибки вызвана несуществующим файлом. Если бы я был вами, я сделаю это:

if(file_exists('your_file_name')){
    unlink('your_file_name');
}else{
    echo 'file not found';
}

Удачи:)

Ответ 3

Этот метод может показаться странным, но я считаю, что он самый надежный

if(is_file($file) && @unlink($file)){
    // delete success
} else if (is_file ($file)) {
    // unlink failed.
    // you would have got an error if it wasn't suppressed
} else {
  // file doesn't exist
}

Почему?

Во-первых, is_file - это правильный метод проверки наличия FILE file_exists. file_exists проверяет как каталоги, так и файлы, поэтому может возвращать TRUE для каталога с тем же именем файла, вы не можете удалить каталог с unlink, и это приведет к ошибке.

Проверка файла существует (is_file) перед тем, как вы unlink является правильным/лучшим способом удаления файла.

if(is_file($file) && unlink($file)){

Но он не является надежным методом, так как обычно файл удаляется в маленьком окне между is_file и unlink. Я экспериментировал это несколько раз, когда метод кэширования использует файловую систему.

Но это лучший метод.

Итак, вы можете сделать все правильно и по-прежнему получать сообщение об ошибке!

Ну, по крайней мере, ошибка говорит вам, не сработает ли... ну на самом деле вы можете сказать, не сработает ли она без ошибки

unlink

Возвращает TRUE при успешном выполнении или FALSE при сбое.

Если вы правильно его закодировали и можете отличить успех и не удалось unlink, то YES подавить ошибку, это не выгодно вам или вашему коду.

Является ли ошибка подавленной или нет, это лучший метод, который я могу придумать, чтобы предотвратить его. Уменьшая время между проверкой и удалением, вы уменьшите вероятность того, что это вызовет ошибку.

EDIT: обновленные URL ссылок

Ответ 4

Вы можете использовать is_writable, чтобы проверить, есть ли у вас надлежащие разрешения для изменения или удаления файла.

http://php.net/manual/en/function.is-writable.php

try {
  if(!is_writable($file))
      throw new Exception('File not writable');

  unlink($file);
}
catch(Exception $e) { /* do what you want */ }