سؤال

يعمل MKDIR () بشكل صحيح هذا السؤال أكثر حول التقاط خطأ. بدلاً من طباعة هذا عند وجود الدليل ، أود فقط أن أكتب إلى رسالة لي في سجل مخصص. كيف أقوم بإنشاء هذا الاستثناء.

تحذير: mkdir () [function.mkdir]: ملف موجود

هل كانت مفيدة؟

المحلول

أود فقط أن أكتب لي رسالة لي في سجل مخصص.

الحل سهل جدا. PHP لديها بالفعل كل شيء من أجلك:

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

أو نفس الإعدادات في php.ini أو .htaccess
أعتقد أنه سيكون أفضل من كتابة كل خطأ ممكن يدويًا

إذا كنت لا تريد تسجيل هذا الخطأ (لأنه قد لا يكون خطأ ولكن جزء من منطق التطبيق) ، يمكنك التحقق من وجود المجلد أولاً

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

نصائح أخرى

يمكنك إيقاف رسالة الخطأ من عرض إما عن طريق قمع رسائل الخطأ على مستوى العالم (في التكوين أو وقت التشغيل) مع display_errors الإعداد ، أو الحالة حسب الحالة عن طريق بادئة استدعاء الوظيفة باستخدام @-حرف. (على سبيل المثال @mkdir('...')).

يمكنك بعد ذلك التحقق مع error_get_last متى mkdir عائدات false.

لتسجيل الخطأ في تسجيل القواعد العالمية. يمكنك تسجيل الأخطاء يدويًا error_log.

لمزيد من القراءة ، راجع القسم اليدوي معالجة الأخطاء.

يحرر:

كما هو مقترح في التعليقات ، فإن معالج الأخطاء المخصص هو أيضًا حل ممكن ، ويمكن القول أنه أكثر قوة (اعتمادًا على تنفيذك) ولكنه بالتأكيد أكثر أناقة.

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

set_error_handler('err_handler');

وبهذه الطريقة ، لن يتم عرض رسالة الخطأ ، إلا إذا قمت بترددها بشكل صريح. لاحظ ، رغم ذلك ، عند استخدام معالج خطأ مخصص error_get_last سيعود NULL.

يمكنك إعادة كتابة أي وظيفة استدعاء النظام مع فئة مثل هذا:

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);
    }

}

ثم يمكنك استدعاء الطريقة واعتراض الاستثناء:

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);
} 

الآن يمكنك علاج جميع أخطاء النظام مع try {...} catch(...) {...} finally {...} بشكل طبيعي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top