السلطان
  1. الرئيسية
  2. الأمثلة
  3. الأخطاء

std.error

قيمة خطأ مشتركة لها هوية ورسالة وسلسلة أسباب وملاحظات

errors/error_values.sn
// std.error: قيمة خطأ مشتركة لها هوية ورسالة وسلسلة أسباب وملاحظات
// (docs/en/reference/errors.md). الشيفرة تقرر بالهوية، لا بنص الرسالة.
استورد std.error.failure;
استورد std.error.from_number;
استورد std.error.from_os;
استورد std.fs.read_file;
استورد std.io.println;
استورد std.text.number;

عرف اقرأ_المنفذ(النص: نص): نتيجة عدد, فشل {
    طابق حلل_عدد(&النص) مع
    | نتيجة.نجح(القيمة) -> {
        إذا (القيمة < 1 || القيمة > 65535) {
            أرجع نتيجة.خطأ(فشل_بهوية("server", "منفذ_خارج_المدى", "يجب أن يكون المنفذ بين 1 و65535"));
        };
        أرجع نتيجة.نجح(القيمة);
    }
    | نتيجة.خطأ(المشكلة) -> {
        // أخطاء std ذات الأنواع تبقى الواجهة الأساسية؛ والمحوّل يجعل أحدها
        // فشلا يحتفظ بهويته («std.text.number»، النوع).
        دع السبب: فشل = فشل_من_خطأ_تحليل_عدد(&المشكلة);
        دع الفشل: متغير فشل = فشل_بسبب("المنفذ ليس عددا", السبب);
        أضف_ملاحظة(&متغير الفشل, "المنفذ مأخوذ من الإعداد PORT");
        أرجع نتيجة.خطأ(الفشل);
    };
}

عرف حمل_الإعدادات(المسار: نص): نتيجة نص, فشل {
    طابق اقرأ_الملف(&المسار) مع
    | نتيجة.نجح(النص) -> { أرجع نتيجة.نجح(النص); }
    | نتيجة.خطأ(الرمز) -> {
        دع السبب: فشل = فشل_من_خطأ_ملف(&الرمز);
        أرجع نتيجة.خطأ(فشل_بسبب("تعذرت قراءة الإعدادات", السبب));
    };
}

عرف الرئيسية(): عدد {
    طابق اقرأ_المنفذ("8080") مع
    | نتيجة.نجح(المنفذ) -> { اطبع_سطر(عدد_إلى_نص(المنفذ)); }
    | نتيجة.خطأ(الفشل) -> { اطبع_فشل(&الفشل); };

    دع نطاق_الأعداد: نص = "std.text.number";
    دع رقم_غير_صالح: نص = "رقم_غير_صالح";
    طابق اقرأ_المنفذ("80x0") مع
    | نتيجة.نجح(المنفذ) -> { اطبع_سطر(عدد_إلى_نص(المنفذ)); }
    | نتيجة.خطأ(الفشل) -> {
        اطبع_سطر(صف_فشل(&الفشل));
        إذا (هل_من_نوع(&الفشل, &نطاق_الأعداد, &رقم_غير_صالح)) {
            اطبع_سطر("القرار بالهوية: محرف غير رقمي");
        };
    };

    دع نطاق_الخادم: نص = "server";
    دع خارج_المدى: نص = "منفذ_خارج_المدى";
    طابق اقرأ_المنفذ("70000") مع
    | نتيجة.نجح(المنفذ) -> { اطبع_سطر(عدد_إلى_نص(المنفذ)); }
    | نتيجة.خطأ(الفشل) -> {
        اطبع_سطر(صف_فشل(&الفشل));
        إذا (هل_من_نوع(&الفشل, &نطاق_الخادم, &خارج_المدى)) {
            اطبع_سطر("القرار بالهوية: خارج المدى");
        };
    };

    دع نطاق_الملفات: نص = "std.fs";
    دع غير_موجود: نص = "غير_موجود";
    طابق حمل_الإعدادات("examples-missing-config.conf") مع
    | نتيجة.نجح(النص) -> { اطبع_سطر(النص); }
    | نتيجة.خطأ(الفشل) -> {
        اطبع_سطر(صف_فشل(&الفشل));
        إذا (هل_من_نوع(&الفشل, &نطاق_الملفات, &غير_موجود)) {
            اطبع_سطر("القرار بالهوية: الملف غير موجود");
        };
    };
    أرجع 0;
}

التشغيل

بالمفسر، دون ترجمة:

./build/sultanc run examples/ar/errors/error_values.sn

أو ترجمه إلى ملف تنفيذي:

./build/sultanc examples/ar/errors/error_values.sn -o build/example && ./build/example

المصدر على GitHub   كل الأمثلة