ব্যতিক্রম: তাড়াতাড়ি ছুঁড়বেন কেন? দেরি ধরবে কেন?


156

বিচ্ছিন্নতার ক্ষেত্রে ব্যতিক্রম হ্যান্ডলিং সম্পর্কে অনেক সুপরিচিত সেরা অনুশীলন রয়েছে। আমি "করণীয় এবং করণীয়" যথেষ্ট পরিমাণে জানি, তবে বৃহত্তর পরিবেশে সেরা অনুশীলন বা নিদর্শনগুলির ক্ষেত্রে জিনিসগুলি জটিল হয়ে যায়। "তাড়াতাড়ি নিক্ষেপ করুন, দেরি করুন" - আমি অনেকবার শুনেছি এবং এটি এখনও আমাকে বিভ্রান্ত করে।

আমি কেন প্রথম দিকে নিক্ষেপ করব এবং দেরিতে ধরব, যদি একটি নিম্ন স্তরের স্তরে নাল পয়েন্টার ব্যতিক্রম ছুঁড়ে দেওয়া হয়? আমি কেন এটি একটি উচ্চ স্তরে ধরব? ব্যবসায়ের স্তরের মতো উচ্চ স্তরে নিম্ন-স্তরের ব্যতিক্রম ধরা আমার পক্ষে বোধগম্য নয়। এটি প্রতিটি স্তর উদ্বেগ লঙ্ঘন বলে মনে হচ্ছে।

নিম্নলিখিত পরিস্থিতিটি কল্পনা করুন:

আমার একটি পরিষেবা রয়েছে যা একটি চিত্রের গণনা করে। চিত্রটি গণনা করার জন্য পরিষেবাটি কাঁচা ডেটা এবং গণনা প্রস্তুত করার জন্য কিছু অন্যান্য পরিষেবা পেতে একটি সংগ্রহস্থল অ্যাক্সেস করে। যদি ডেটা পুনরুদ্ধার স্তরে কিছু ভুল হয়ে যায় তবে আমি কেন একটি ডেটা রিটারিভ্যাল এক্সপ্লেশনকে উচ্চ স্তরে ফেলে দেব? এর বিপরীতে আমি ব্যতিক্রমটিকে একটি অর্থবহ ব্যতিক্রমতে আবৃত করতে পছন্দ করব, উদাহরণস্বরূপ একটি ক্যালকুলেশনসোর্সেসপশন।

কেন তাড়াতাড়ি ফেল, কেন দেরি ধরবে?


104
"ক্যাচ লেট" এর পেছনের ধারণাটি যতটা সম্ভব দেরি করানো বরং যত তাড়াতাড়ি দরকারী হিসাবে ধরা সম্ভব। উদাহরণস্বরূপ, যদি আপনার কাছে কোনও ফাইল পার্সার থাকে তবে কোনও ফাইল হ্যান্ডল করার কোনও পয়েন্ট পাওয়া যায় না। আপনি এটির সাথে কী বোঝাতে চেয়েছেন, আপনার পুনরুদ্ধারের পথটি কী? একটি নেই, তাই ধরবেন না। আপনার লিক্সারে যান, আপনি সেখানে কী করেন, আপনি কীভাবে এই থেকে পুনরুদ্ধার করবেন যে আপনার প্রোগ্রামটি চালিয়ে যেতে পারে? এটি পারে না, ব্যতিক্রমটি পাস হোক। আপনার স্ক্যানার কীভাবে এটি পরিচালনা করতে পারে? এটি পারে না, এটি পাস হতে দিন। কলিং কোড কীভাবে এটি পরিচালনা করতে পারে? এটি হয় অন্য একটি ফাইলপথ চেষ্টা করে বা ব্যবহারকারীকে সতর্ক করতে পারে, তাই ধরুন।
ফোশি

16
খুব কম কেসই আছে যেখানে নালপয়েন্টার এক্সসেপশন (আমি ধরে নিই যে এনপিই এর অর্থ যা) কখনও ধরা পড়ে; যদি সম্ভব হয় তবে এটি প্রথমে এড়ানো উচিত। যদি আপনার নালপয়েন্টারএক্সেপশন থাকে তবে আপনার কিছু ভাঙা কোড রয়েছে যা ঠিক করতে হবে। এটি সম্ভবত খুব সহজ সমাধান।
ফিল

6
দয়া করে, ছেলেরা, এই প্রশ্নটিকে সদৃশ হিসাবে বন্ধ করার পরামর্শ দেওয়ার আগে, অন্য প্রশ্নের উত্তর এই প্রশ্নের খুব ভাল উত্তর দেয় না তা পরীক্ষা করে দেখুন।
ডক ব্রাউন

1
(সিটিবট) আজ.জভা.নাট / পার্টিকেল / ২০০৩/11/ 20/… যদি এই উক্তিটির উত্স না হয় তবে দয়া করে উত্সটির একটি রেফারেন্স সরবরাহ করুন যা আপনি মনে করেন সর্বাধিক সম্ভাব্য মূল উক্তি।
রওয়ং

1
এই প্রশ্নে পৌঁছানোর এবং অ্যান্ড্রয়েড বিকাশকারী যে কারও জন্য কেবল একটি অনুস্মারক। অ্যান্ড্রয়েডে, ব্যতিক্রমগুলি অবশ্যই স্থানীয়ভাবে ধরা এবং পরিচালনা করতে হবে - একই ফাংশনে যেখানে এটি প্রথম ধরা পড়ে। এটি কারণ ম্যাসেজ হ্যান্ডলারগুলির ব্যতিক্রমগুলি প্রচার করে না - এটি হ'ল যদি আপনার অ্যাপ্লিকেশনটি মারা যায়। সুতরাং, অ্যান্ড্রয়েড বিকাশ করার সময় আপনার এই পরামর্শটি উদ্ধৃত করা উচিত নয়।
rwong

উত্তর:


118

আমার অভিজ্ঞতায়, ত্রুটিগুলি যেখানে ঘটেছিল সেখানে ব্যতিক্রম ছুঁড়ে ফেলার সেরা best আপনি এটি করেন কারণ এটি সেই জায়গা যেখানে আপনি জানেন যে কেন ব্যতিক্রমটি ট্রিগার হয়েছিল।

ব্যতিক্রমগুলি স্তরগুলি ব্যাক আপ করার সাথে সাথে ব্যতিক্রমে অতিরিক্ত প্রসঙ্গ যুক্ত করার জন্য ক্যাচিং এবং পুনর্বিবেচনা একটি ভাল উপায়। এর অর্থ ভিন্ন ধরণের ব্যতিক্রম ছুঁড়ে ফেলার অর্থ হতে পারে তবে আপনি যখন এটি করবেন তখন মূল ব্যতিক্রম অন্তর্ভুক্ত করবেন।

অবশেষে ব্যতিক্রমটি এমন একটি স্তরে পৌঁছে যাবে যেখানে আপনি কোড প্রবাহের বিষয়ে সিদ্ধান্ত নিতে সক্ষম হন (উদাহরণস্বরূপ ব্যবহারকারীকে কর্মের জন্য অনুরোধ করা হবে)। এটি এমন একটি পয়েন্ট যেখানে আপনাকে অবশেষে ব্যতিক্রমটি পরিচালনা করতে হবে এবং সাধারণ সম্পাদন চালিয়ে যাওয়া উচিত।

আপনার কোড বেসের সাথে অনুশীলন এবং অভিজ্ঞতার সাহায্যে ত্রুটিগুলিতে অতিরিক্ত প্রসঙ্গ যুক্ত করার সময় বিচার করা খুব সহজ হয়ে যায় এবং যেখানে এটি আসলে সবচেয়ে বুদ্ধিমান হয় অবশেষে ত্রুটিগুলি পরিচালনা করে।

ক্যাথ → রিথ্রো

এটি যেখানে আপনি কার্যকরভাবে আরও তথ্য যুক্ত করতে পারেন যা কোনও বিকাশকারীকে সমস্যাটি বোঝার জন্য সমস্ত স্তর দিয়ে কাজ করার জন্য সংরক্ষণ করতে পারে।

ধরুন → হ্যান্ডেল করুন

এটি কোনও ক্ষেত্রে উপযুক্ত, তবে সফ্টওয়্যারটির মাধ্যমে বিভিন্ন কার্যকরকরণের প্রবাহের বিষয়ে আপনি চূড়ান্ত সিদ্ধান্ত নিতে পারেন Do

ক্যাচ → ত্রুটি রিটার্ন

যদিও এমন পরিস্থিতি রয়েছে যেখানে এটি যথাযথ, ব্যতিক্রম ধরা এবং কলারকে ত্রুটির মান ফিরিয়ে দেওয়া ক্যাচ → রিথ্রো বাস্তবায়নে রিফ্যাক্টরিংয়ের জন্য বিবেচনা করা উচিত।


হ্যাঁ, আমি ইতিমধ্যে জানি এবং এগুলির বহিঃপ্রকাশ, যে ত্রুটিটি উত্পন্ন সেখানে আমার ব্যতিক্রম ছুঁড়ে ফেলা উচিত। তবে কেন আমি এনপিই ধরব না এবং পরিবর্তে এটি স্ট্যাকট্রেস উপরে উঠতে দেব? আমি সর্বদা এনপিই ধরতাম এবং এটিকে একটি অর্থবহ ব্যতিক্রমে গুটিয়ে রাখতাম। পরিষেবা বা ইউআই স্তর পর্যন্ত কেন আমার ডিএও-এক্সপেনশন ছুঁড়ে দেওয়া উচিত তা আমি কোনও সুবিধা দেখতে পাচ্ছি না। আমি সর্বদা এটি পরিষেবা স্তরে ধরতাম এবং অতিরিক্ত বিশদ তথ্যের সাথে একটি পরিষেবা ব্যতিক্রমে এটি গুটিয়ে রাখতাম, কেন পরিষেবাটি কল করা ব্যর্থ হয়েছিল।
shylynx

8
@ শ্যালিনএক্স একটি ব্যতিক্রম ধরা এবং তারপরে আরও অর্থবহ ব্যতিক্রম পুনর্বিবেচনা করা ভাল কাজ। আপনি কি কাজ করা উচিত নয় খুব তাড়াতাড়ি একটি ব্যতিক্রম সংক্রামক এবং তারপর না এটা rethrowing। উক্তিটি যে ভুলটির বিষয়ে সতর্ক করে দিচ্ছে তা ব্যতিক্রমটি খুব তাড়াতাড়ি ধরা পড়ছে এবং তারপরে কোডের ভুল স্তরে এটি পরিচালনা করার চেষ্টা করছে।
সাইমন বি

ব্যতিক্রম প্রাপ্তির প্রসঙ্গে প্রসঙ্গটি সুস্পষ্ট করে তোলা আপনার দলের বিকাশকারীদের পক্ষে জীবন সহজ করে তোলে। এনপিইর সমস্যাটি বোঝার জন্য আরও তদন্ত প্রয়োজন
মাইকেল শ

4
@ শাইলিনক্স কেউ এই প্রশ্ন জিজ্ঞাসা করতে পারেন, "আপনার কোডে এমন একটি বিন্দু রয়েছে যা একটি নিক্ষেপ করতে পারেNullPointerException ? কেন খুব শীঘ্রই nullএকটি ব্যতিক্রম (সম্ভবত একটি IllegalArgumentException) অনুসন্ধান করা এবং ছুঁড়ে দেওয়া উচিত নয় যাতে কলারটি জানতে পারে যে খারাপটি কোথায় প্রবেশ করেছে null?" আমি বিশ্বাস করি যে উক্তির "প্রারম্ভিক নিক্ষেপ" অংশটি পরামর্শ দেবে।
jpmc26

2
@jpmc স্তরগুলি এবং ব্যতিক্রমগুলির আশেপাশের উদ্বেগগুলিকে জোর দেওয়ার জন্য আমি কেবল উদাহরণ হিসাবে এনপিই নিয়েছি। আমি এটির পাশাপাশি একটি অবৈধআর্গুমেন্টএক্সপেশনও প্রতিস্থাপন করতে পারি।
shylynx

56

আপনি যত তাড়াতাড়ি সম্ভব একটি ব্যতিক্রম ছুঁড়ে ফেলতে চান কারণ এর কারণ খুঁজে পাওয়া সহজ করে তোলে। উদাহরণস্বরূপ, এমন একটি পদ্ধতি বিবেচনা করুন যা নির্দিষ্ট যুক্তি দিয়ে ব্যর্থ হতে পারে। আপনি যদি আর্গুমেন্টগুলি যাচাই করেন এবং পদ্ধতিটির খুব গোড়াতেই ব্যর্থ হন, আপনি তাত্ক্ষণিকভাবে বুঝতে পারবেন ত্রুটিটি কলিং কোডে রয়েছে। যদি আপনি ব্যর্থ হওয়ার আগে যুক্তিগুলির প্রয়োজন না হওয়া পর্যন্ত অপেক্ষা করেন তবে আপনাকে কার্যকর করতে হবে এবং বাগটি কলিং কোড (খারাপ তর্ক) বা পদ্ধতিতে কোনও বাগ রয়েছে কিনা তা নির্ধারণ করতে হবে। আপনি ব্যতিক্রমটি যতটা আগে নিক্ষেপ করবেন, এটি তার অন্তর্নিহিত কারণের নিকটবর্তী এবং বিষয়গুলি কোথায় ভুল হয়েছে তা নির্ধারণ করা আরও সহজ।

উচ্চ স্তরে ব্যতিক্রমগুলি পরিচালনার কারণ হ'ল নিম্ন স্তরেরগুলি ত্রুটিটি পরিচালনা করার জন্য যথাযথ পদক্ষেপের কী তা জানে না। প্রকৃতপক্ষে, কলিং কোডটি কী তা নির্ভর করে একই ত্রুটিটি পরিচালনা করার একাধিক উপযুক্ত উপায় থাকতে পারে। উদাহরণস্বরূপ একটি ফাইল খোলার গ্রহণ করুন। আপনি যদি কোনও কনফিগার ফাইল খোলার চেষ্টা করছেন এবং এটি সেখানে নেই, ব্যতিক্রম উপেক্ষা করে ডিফল্ট কনফিগারেশন নিয়ে এগিয়ে যাওয়া একটি উপযুক্ত প্রতিক্রিয়া হতে পারে। আপনি যদি কোনও প্রাইভেট ফাইল খোলেন যা প্রোগ্রামটির বাস্তবায়নের পক্ষে অত্যাবশ্যক এবং এটি কোনওভাবে অনুপস্থিত, তবে আপনার একমাত্র বিকল্পটি সম্ভবত প্রোগ্রামটি বন্ধ করা।

সঠিক প্রকারে ব্যতিক্রমগুলি মোড়ানো একটি সম্পূর্ণরূপে অস্থিসঙ্গী উদ্বেগ।


1
কেন বিভিন্ন স্তরের বিষয়টি স্পষ্টভাবে ব্যাখ্যা করার জন্য +1। ফাইল সিস্টেম ত্রুটিতে দুর্দান্ত উদাহরণ।
হুয়ান কার্লোস কোটো

24

অন্যরা কেন খুব তাড়াতাড়ি নিক্ষেপ করতে হবে তা পুরোপুরি সংক্ষেপে জানিয়েছেন । পরিবর্তে দেরী অংশটি কেন ধরতে হবে সে সম্পর্কে আমাকে কেন্দ্রীভূত করা যাক , যার জন্য আমি আমার স্বাদের জন্য সন্তোষজনক ব্যাখ্যা দেখিনি।

ব্যতিক্রম কেন?

ব্যতিক্রমগুলি কেন প্রথম স্থানে রয়েছে তা নিয়ে বেশ বিভ্রান্তি রয়েছে বলে মনে হয়। আমাকে এখানে বড় গোপনীয়তা ভাগ করে নিতে দাও: ব্যাতিক্রমের কারণ এবং ব্যতিক্রম হ্যান্ডেলিং হ'ল ... বিমূর্তি

আপনি কি কোডটি দেখেছেন:

static int divide(int dividend, int divisor) throws DivideByZeroException {
    if (divisor == 0)
        throw new DivideByZeroException(); // that's a checked exception indeed

    return dividend / divisor;
}

static void doDivide() {
    int a = readInt();
    int b = readInt(); 
    try {
        int res = divide(a, b);
        System.out.println(res);
    } catch (DivideByZeroException e) {
        // checked exception... I'm forced to handle it!
        System.out.println("Nah, can't divide by zero. Try again.");
    }
}

ব্যতিক্রমগুলি কীভাবে ব্যবহার করা উচিত তা তা নয়। উপরের মত কোডটি বাস্তব জীবনে বিদ্যমান, তবে এগুলি আরও ক্ষুণ্ন হয় এবং সত্যই ব্যতিক্রম (শ্লেষ)। উদাহরণস্বরূপ বিভাগের সংজ্ঞা , এমনকি খাঁটি গণিতেও শর্তযুক্ত: ইনপুট ডোমেনকে সীমাবদ্ধ রাখতে সর্বদা "কলার কোড" হ'ল শূন্যের ব্যতিক্রমী কেসটি পরিচালনা করতে হবে। এটা কুৎসিত. এটি কলারের পক্ষে সর্বদা ব্যথা হয়। তবুও, এই জাতীয় পরিস্থিতিতে চেক-টু-ডু- প্যাটার্ন হ'ল প্রাকৃতিক উপায়:

static int divide(int dividend, int divisor) {
    // throws unchecked ArithmeticException for 0 divisor
    return dividend / divisor;
}

static void doDivide() {
    int a = readInt();
    int b = readInt();
    if (b != 0) {
        int res = divide(a, b);
        System.out.println(res);
    } else {
        System.out.println("Nah, can't divide by zero. Try again.");
    }
}

বিকল্পভাবে, আপনি ওওপি স্টাইলে সম্পূর্ণ কমান্ডো যেতে পারেন:

static class Division {
    final int dividend;
    final int divisor;

    private Division(int dividend, int divisor) {
        this.dividend = dividend;
        this.divisor = divisor;
    }

    public boolean check() {
        return divisor != 0;
    }

    public int eval() {
        return dividend / divisor;
    }

    public static Division with(int dividend, int divisor) {
        return new Division(dividend, divisor);
    }
}

static void doDivide() {
    int a = readInt();
    int b = readInt(); 
    Division d = Division.with(a, b);
    if (d.check()) {
        int res = d.eval();
        System.out.println(res);
    } else {
        System.out.println("Nah, can't divide by zero. Try again.");
    }
}

আপনি দেখতে পাচ্ছেন, কলার কোডটিতে প্রি-চেকের বোঝা রয়েছে তবে পরে কোনও ব্যতিক্রম হ্যান্ডলিং করে না। যদি কোনও ArithmeticExceptionকলিং থেকে আসে divideবা আসে eval, তবে আপনারা হ'ল ব্যতিক্রমগুলি হ্যান্ডলিং করতে হবে এবং আপনার কোডটি ঠিক করতে হবে, কারণ আপনি এটি ভুলে গেছেন check()। একই কারণের জন্য একটি NullPointerExceptionপ্রায়শই প্রায়শই করা ভুল জিনিস।

এখন কিছু লোক আছেন যারা বলছেন যে তারা পদ্ধতি / ফাংশন স্বাক্ষরের ব্যতিক্রমী মামলাগুলি দেখতে চান, অর্থাত্ আউটপুট ডোমেনটি স্পষ্টভাবে প্রসারিত করতে । তারাই পরীক্ষিত ব্যতিক্রমগুলির পক্ষে । অবশ্যই, আউটপুট ডোমেন পরিবর্তন করার জন্য যে কোনও সরাসরি কলার কোডটি মানিয়ে নিতে বাধ্য করা উচিত এবং এটি চেক ব্যতিক্রমগুলির সাথে অর্জন করা উচিত। তবে এর জন্য আপনাকে ব্যতিক্রমের দরকার নেই! এজন্য আপনার Nullable<T> জেনেরিক ক্লাস , কেস ক্লাস , বীজগণিত ডেটা ধরণের এবং ইউনিয়নের ধরণ রয়েছেকিছু OO লোক এমনকি সাধারণ ত্রুটিযুক্ত মামলায় ফিরে আসতে পছন্দ করতে পারে null:

static Integer divide(int dividend, int divisor) {
    if (divisor == 0) return null;
    return dividend / divisor;
}

static void doDivide() {
    int a = readInt();
    int b = readInt(); 
    Integer res = divide(a, b);
    if (res != null) {
        System.out.println(res);
    } else {
        System.out.println("Nah, can't divide by zero. Try again.");
    }
}

প্রযুক্তিগতভাবে ব্যতিক্রমগুলি উপরের মতো উদ্দেশ্যে ব্যবহার করা যেতে পারে, তবে এখানে মূল বিষয়টি: এই ধরনের ব্যবহারের জন্য ব্যতিক্রমগুলি বিদ্যমান নেই । ব্যতিক্রমগুলি অ্যাবস্ট্রাকশন are ব্যতিক্রম ইন্ডিয়ারেশন সম্পর্কে। ব্যতিক্রমগুলি সরাসরি ক্লায়েন্টের চুক্তিগুলি না ভেঙে "ফলাফল" ডোমেনকে প্রসারিত করার এবং "অন্য কোথাও" স্থির করে ত্রুটি হ্যান্ডল করার অনুমতি দেয়। আপনার কোড ব্যতিক্রম যা একই কোডের সরাসরি কলারের মধ্যে পরিচালনা করা হয়, তাদের মধ্যে বিমূর্ততা কোন স্তর ছাড়া ছোঁড়ার, তাহলে আপনি তা করছেন ভুল

দেরিতে কীভাবে ধরা যায়?

তাই আমরা এখানে. উপরের পরিস্থিতিগুলিতে ব্যতিক্রমগুলি ব্যবহার করা ব্যতিক্রমগুলি কীভাবে ব্যবহার করা হয় তা বোঝানোর জন্য আমি এটি দেখানোর পক্ষে যুক্তি দেখিয়েছি। একটি প্রকৃত ব্যবহারের কেস বিদ্যমান রয়েছে, যেখানে ব্যতিক্রম পরিচালনা দ্বারা প্রস্তাবিত বিমূর্ততা এবং দিকনির্দেশ অপরিহার্য। এই জাতীয় ব্যবহার বুঝতে পেরে দেরি করে দেওয়া সুপারিশটি বুঝতে সহায়তা করবে ।

যে ব্যবহারের কেসটি হ'ল: রিসোর্স অ্যাস্ট্রাকশনসের বিরুদ্ধে প্রোগ্রামিং ...

হ্যাঁ, ব্যবসায়ের যুক্তিগুলি বিমূর্ততার বিরুদ্ধে প্রোগ্রাম করা উচিত , কংক্রিট বাস্তবায়ন নয়। শীর্ষ স্তরের আইওসি "ওয়্যারিং" কোডটি রিসোর্স অ্যাবস্ট্রাকশনগুলির কংক্রিট বাস্তবায়নগুলি তাত্ক্ষণিকভাবে উত্সাহিত করবে এবং এগুলিকে ব্যবসায়িক যুক্তিতে সরিয়ে দেবে। এখানে নতুন কিছু নেই। কিন্তু এই সংস্থানগুলি বিমূর্তকরণগুলির কংক্রিট বাস্তবায়নগুলি সম্ভবত তাদের নিজস্ব প্রয়োগের নির্দিষ্ট ব্যতিক্রমগুলি ছুঁড়ে ফেলতে পারে , তাই না?

তাহলে এই প্রয়োগগুলি নির্দিষ্ট ব্যতিক্রমগুলি কে পরিচালনা করতে পারে? তখন কি ব্যবসার যুক্তিতে কোনও সংস্থান নির্দিষ্ট ব্যতিক্রমগুলি পরিচালনা করা সম্ভব? না, তা নয়। ব্যবসায়ের যুক্তি বিমূর্ততার বিরুদ্ধে প্রোগ্রাম করা হয়, যা নির্দিষ্টকরণের ব্যতিক্রম সম্পর্কিত নির্দিষ্ট বিবরণগুলির জ্ঞানকে বাদ দেয় না।

"আহা!", আপনি হয়ত বলতে পারেন: "তবে সে কারণেই আমরা ব্যতিক্রমগুলি সাবক্লাস করতে পারি এবং ব্যতিক্রম শ্রেণিবিন্যাস তৈরি করতে পারি" ( মিঃ স্প্রিং দেখুন !)। আমি আপনাকে বলি, এটি একটি ভ্রান্তি। প্রথমত, ওওপি-র প্রতিটি যুক্তিসঙ্গত বই বলে যে কংক্রিটের উত্তরাধিকার খারাপ, তবুও কোনওভাবেই জেভিএমের এই মূল উপাদানটি ব্যতিক্রম হ্যান্ডলিং কংক্রিটের উত্তরাধিকারের সাথে ঘনিষ্ঠভাবে জড়িত। হাস্যকর বিষয় হল, জোশুয়া ব্লচ কোনও কার্যকর জেভিএমের অভিজ্ঞতা অর্জনের আগে তার কার্যকর জাভা বইটি লিখতে পারতেন না , তিনি কি? এটি পরবর্তী প্রজন্মের জন্য "পাঠ শিখানো" বইয়ের আরও বেশি কিছু। দ্বিতীয়ত, এবং আরও গুরুত্বপূর্ণ, আপনি যদি উচ্চ-স্তরের ব্যতিক্রম ধরেন তবে আপনি কীভাবে এটি পরিচালনা করতে চলেছেন?PatientNeedsImmediateAttentionException: আমাদের কি তাকে একটা বড়ি দিতে হবে বা পা কেটে ফেলতে হবে !? সমস্ত সম্ভাব্য সাবক্লাসের উপর একটি স্যুইচ স্টেটমেন্ট সম্পর্কে কীভাবে? আপনার পলিমারফিজমটি সেখানে যায়, বিমূর্ততাটি সেখানে যায়। তুমি ঠিকমত বুঝেছ.

তাহলে রিসোর্স নির্দিষ্ট ব্যতিক্রমগুলি কে পরিচালনা করতে পারে? এটা অবশ্যই যারা সিদ্ধান্তগুলি জানেন! যিনি রিন্সট্যান্ট করেছেন রিসোর্স! "ওয়্যারিং" কোড অবশ্যই! এটা দেখ:

ব্যবসায়িক যুক্তি অ্যাবস্ট্রাকশনগুলির বিরুদ্ধে কোডেড ... কোনও সংস্থান পুনরুদ্ধারের ত্রুটি হ্যান্ডলিং!

static interface InputResource {
    String fetchData();
}

static interface OutputResource {
    void writeData(String data);
}

static void doMyBusiness(InputResource in, OutputResource out, int times) {
    for (int i = 0; i < times; i++) {
        System.out.println("fetching data");
        String data = in.fetchData();
        System.out.println("outputting data");
        out.writeData(data);
    }
}

এদিকে অন্য কোথাও কংক্রিট বাস্তবায়ন ...

static class ConstantInputResource implements InputResource {
    @Override
    public String fetchData() {
        return "Hello World!";
    }
}

static class FailingInputResourceException extends RuntimeException {
    public FailingInputResourceException(String message) {
        super(message);
    }
}

static class FailingInputResource implements InputResource {
    @Override
    public String fetchData() {
        throw new FailingInputResourceException("I am a complete failure!");
    }
}

static class StandardOutputResource implements OutputResource {
    @Override
    public void writeData(String data) {
        System.out.println("DATA: " + data);
    }
}

এবং অবশেষে তারের কোড ... কংক্রিট সংস্থান ব্যতিক্রমগুলি কে পরিচালনা করে? তাদের সম্পর্কে কে জানে!

static void start() {
    InputResource in1 = new FailingInputResource();
    InputResource in2 = new ConstantInputResource();
    OutputResource out = new StandardOutputResource();

    try {
        ReusableBusinessLogicClass.doMyBusiness(in1, out, 3);
    }
    catch (FailingInputResourceException e)
    {
        System.out.println(e.getMessage());
        System.out.println("retrying...");
        ReusableBusinessLogicClass.doMyBusiness(in2, out, 3);
    }
}

এখন আমার সাথে সহ্য করুন। উপরের কোড হল সরল। আপনি বলতে পারেন যে আপনার কাছে আইওসি ধারক পরিচালিত সংস্থাগুলির একাধিক স্কোপ সহ একটি এন্টারপ্রাইজ অ্যাপ্লিকেশন / ওয়েব ধারক রয়েছে এবং আপনার স্বয়ংক্রিয় পুনরায় চেষ্টা এবং অধিবেশন পুনরায় পুনর্নির্মাণ বা স্কোপ রিসোর্সগুলির অনুরোধ করা ইত্যাদি প্রয়োজন lower সংস্থান তৈরি করুন, সুতরাং সঠিক বাস্তবায়ন সম্পর্কে সচেতন না। এই নিম্ন স্তরের সংস্থানগুলি কী ব্যতিক্রম করতে পারে তা কেবলমাত্র উচ্চ স্তরের স্কোপগুলিই সত্যিই জানতে পারে। এবার ধর!

দুর্ভাগ্যক্রমে, ব্যতিক্রমগুলি কেবল কল স্ট্যাকের উপরে ইন্ডিয়ারেশনের অনুমতি দেয় এবং বিভিন্ন কার্ডিনালিটির সাথে বিভিন্ন স্কোপগুলি সাধারণত একাধিক ভিন্ন থ্রেডে চালিত হয়। ব্যতিক্রম ছাড়া এর মাধ্যমে যোগাযোগের কোনও উপায় নেই। আমাদের এখানে আরও শক্তিশালী কিছু দরকার। উত্তর: অ্যাসিঙ্ক বার্তা পাস হচ্ছে । নিম্ন স্তরের সুযোগের মূলটিতে প্রতিটি ব্যতিক্রম ধরা C কিছু উপেক্ষা করবেন না, কিছু যাতে পিছলে না যায়। এটি বর্তমান সুযোগের কল স্ট্যাকের তৈরি সমস্ত সংস্থানগুলি বন্ধ এবং নিষ্পত্তি করবে। তারপরে ব্যতিক্রম হ্যান্ডলিং রুটিনে বার্তা সারি / চ্যানেল ব্যবহার করে ত্রুটি বার্তাগুলি উচ্চতর আকারে প্রচার করুন, যতক্ষণ না আপনি সিদ্ধান্তটি জানা যায় known এই লোকটি যিনি এটি পরিচালনা করতে জানেন।

সুমা সমারাম

সুতরাং আমার ব্যাখ্যা অনুসারে দেরি করার অর্থ সবচেয়ে সুবিধাজনক স্থানে ব্যতিক্রমগুলি ধরা যেখানে আপনি আর কোনও সংক্ষেপণ বন্ধ করছেন না । খুব তাড়াতাড়ি ধরবেন না! আপনি যে স্তরে রিসোর্স অ্যাবস্ট্রাকশনগুলির উদাহরণ নিক্ষেপকারী কংক্রিট ব্যতিক্রমগুলি তৈরি করেন সেখানে স্তর ব্যতিক্রমগুলি ধরুন, যে স্তরটি বিমূর্ততার কনক্রেশনগুলি জানে । "তারের" স্তর।

আছে HTH। শুভ কোডিং!


আপনি ঠিক বলেছেন যে ইন্টারফেস সরবরাহকারী কোড ইন্টারফেসটি ব্যবহার করে এমন কোডের চেয়ে কী ভুল হতে পারে সে সম্পর্কে আরও জানতে পারবেন, তবে মনে করুন যে কোনও পদ্ধতি একই ইন্টারফেস ধরণের দুটি সংস্থান ব্যবহার করে এবং ব্যর্থতাগুলি আলাদাভাবে পরিচালনা করা দরকার? বা যদি সেই সংস্থাগুলির মধ্যে একটি যদি অভ্যন্তরীণভাবে, এর বাস্তবায়নের বিবরণ হিসাবে এর স্রষ্টাকে জানা যায় না, তবে একই ধরণের অন্যান্য নেস্টেড সংস্থানগুলি ব্যবহার করে? ব্যবসায়ের স্তরটি নিক্ষেপ করা WrappedFirstResourceExceptionবা WrappedSecondResourceExceptionসমস্যাটির মূল কারণটি দেখার জন্য "তারের" স্তরটি তার ব্যতিক্রমের অভ্যন্তরে দেখতে প্রয়োজন ...
সুপারক্যাট

... আইকিও হতে পারে তবে এটি ধরে নেওয়া আরও ভাল মনে হবে যে কোনও FailingInputResourceব্যতিক্রমই অপারেশনের ফলে হবে in1। আসলে, আমি মনে করি অনেক ক্ষেত্রেই তারের স্তরটি একটি ব্যতিক্রম-হ্যান্ডলিং অবজেক্টটি পাস করা এবং ব্যবসায়ের স্তরটিকে এমন একটি অন্তর্ভুক্ত করা উচিত catchযা তারপরে সেই বস্তুর handleExceptionপদ্ধতির প্রতি আহ্বান জানায় । এই পদ্ধতিটি পুনর্বিবেচনা করতে পারে, বা ডিফল্ট ডেটা সরবরাহ করতে পারে, বা একটি "পরিত্যক্ত / পুনরায় চেষ্টা / ব্যর্থ" প্রম্পট স্থাপন করতে পারে এবং অ্যাপ্লিকেশনটির প্রয়োজনীয়তার উপর নির্ভর করে অপারেটরকে কী করতে হবে ইত্যাদি সিদ্ধান্ত নিতে দেয়।
সুপারক্যাট

@ সুপের্যাট আমি বুঝতে পারছি আপনি কী বলছেন। আমি বলব একটি কংক্রিট রিসোর্স বাস্তবায়ন এটি ফেলতে পারে এমন ব্যতিক্রমগুলি জানার জন্য দায়বদ্ধ। এটিতে সমস্ত কিছুই নির্দিষ্ট করতে হবে না (তথাকথিত অপরিজ্ঞাত আচরণ বলা হয় ) তবে এটি অবশ্যই নিশ্চিত করবে যে কোনও অস্পষ্টতা নেই। এছাড়াও, চেক না করা রান-টাইম ব্যতিক্রমগুলি ডকুমেন্ট করতে হবে। যদি এটি ডকুমেন্টেশনের সাথে বিরোধিতা করে তবে এটি একটি বাগ। যদি কলার কোডটি কোনও ব্যতিক্রম সম্পর্কে বুদ্ধিমান কিছু করার প্রত্যাশা করা হয়, তবে সর্বনিম্ন হ'ল সংস্থানটি UnrecoverableInternalExceptionএইচটিটিপি 500 ত্রুটি কোডের অনুরূপ কিছুতে মোড়ানো ps
ড্যানিয়েল ডিনিজ

@ সুপের্যাট কনফিগারযোগ্য ত্রুটি হ্যান্ডলারের বিষয়ে আপনার পরামর্শ সম্পর্কে: ঠিক! আমার শেষ উদাহরণে ত্রুটি পরিচালনার ত্রুটিটি হার্ড-কোডেড, স্থির doMyBusinessপদ্ধতিটিকে কল করে । এটি ব্রিভের পক্ষে ছিল এবং এটিকে আরও গতিশীল করা পুরোপুরি সম্ভব। এই জাতীয় Handlerশ্রেণিটি কিছু ইনপুট / আউটপুট সংস্থান দিয়ে তাত্ক্ষণিকভাবে চালিত হবে এবং এমন একটি handleপদ্ধতি রয়েছে যা একটি ক্লাস বাস্তবায়ন করে যা ReusableBusinessLogicInterface। তারপরে তারের স্তরটিতে বিভিন্ন হ্যান্ডলার, সংস্থান এবং ব্যবসায় যুক্তি প্রয়োগের প্রয়োগের জন্য আপনি একত্রিত / কনফিগার করতে পারেন।
ড্যানিয়েল ডান্নয়েস

10

এই প্রশ্নের যথাযথ উত্তর দিতে, আসুন আমরা এক পদক্ষেপ নেব এবং আরও মৌলিক প্রশ্ন জিজ্ঞাসা করি।

কেন আমাদের প্রথম ব্যতিক্রম আছে?

আমাদের পদ্ধতির কলকারীকে জানাতে আমরা ব্যতিক্রম ছুঁড়ে ফেলি যে আমাদের যা করতে বলা হয়েছিল আমরা তা করতে পারি নি। ব্যতিক্রমের ধরণটি ব্যাখ্যা করে যে আমরা যা করতে চাইছিলাম তা কেন করতে পারিনি।

আসুন কিছু কোড দেখুন:

double MethodA()
{
    return PropertyA - PropertyB.NestedProperty;
}

এই কোডটি নাল হলে স্পষ্টতই একটি নাল রেফারেন্স ব্যতিক্রম ছুঁড়ে ফেলতে পারে PropertyB। এই পরিস্থিতিতে "সংশোধন" করতে আমরা এই ক্ষেত্রে দুটি জিনিস করতে পারি। আমরা পারে:

  • আমাদের কাছে প্রপার্টিবি না থাকলে স্বয়ংক্রিয়ভাবে তৈরি করুন; অথবা
  • ব্যতিক্রমটি কলিং পদ্ধতিতে বুদবুদ হতে দিন।

এখানে সম্পত্তি বি তৈরি করা খুব বিপজ্জনক হতে পারে। এই পদ্ধতিতে সম্পত্তি বি তৈরির কী কারণ রয়েছে? অবশ্যই এটি একক দায়িত্বের নীতি লঙ্ঘন করবে। সমস্ত সম্ভাবনায়, যদি সম্পত্তি বি এখানে উপস্থিত না থাকে তবে এটি নির্দেশ করে যে কিছু ভুল হয়েছে gone আংশিকভাবে নির্মিত বস্তুটিতে পদ্ধতিটি আহ্বান করা হচ্ছে বা সম্পত্তি বি টি বাতিল হয়ে গেছে। এখানে প্রপার্টিবি তৈরি করে আমরা একটি বৃহত্তর বাগ লুকিয়ে রাখতে পারি যা পরে আমাদের দংশন করতে পারে, যেমন একটি ত্রুটি যার ফলে ডেটা দুর্নীতি হয়।

পরিবর্তে, যদি আমরা নাল রেফারেন্স বুদ্বুদ আপ করি, আমরা বিকাশকারী যিনি এই পদ্ধতিটি কল করেছেন তাদের যত তাড়াতাড়ি সম্ভব পারি, তা জানাতে দিচ্ছি যে কিছু ভুল হয়েছে। এই পদ্ধতিটি কল করার একটি অতীব গুরুত্বপূর্ণ শর্ত মিস হয়েছে।

সুতরাং বাস্তবে, আমরা তাড়াতাড়ি ছোঁড়াচ্ছি কারণ এটি আমাদের উদ্বেগকে আরও ভালভাবে আলাদা করে দেয়। ত্রুটি হওয়ার সাথে সাথে আমরা প্রবাহের বিকাশকারীদের এটি সম্পর্কে জানাতে দিচ্ছি।

কেন আমরা "দেরিতে ধরি" আলাদা গল্প। আমরা সত্যিই দেরিতে ধরতে চাই না, সমস্যাটি কীভাবে সঠিকভাবে পরিচালনা করতে হয় আমরা তাড়াতাড়ি ধরতে চাই। কিছু সময়ের এটি পরে বিমূর্ততার পনের স্তর হবে এবং কিছু সময় এটি তৈরির পর্যায়ে থাকবে।

মুল বক্তব্যটি হ'ল আমরা বিমূর্ততার স্তরে ব্যতিক্রমটি ধরতে চাই যা আমাদের সেই ব্যতিক্রমটি হ্যান্ডেল করতে দেয় যেখানে আমাদের সঠিকভাবে ব্যতিক্রমটি পরিচালনা করার জন্য প্রয়োজনীয় সমস্ত তথ্য রয়েছে।


আমি মনে করি আপনি আপস্ট्रीम বিকাশকারীকে ভুল অর্থে ব্যবহার করছেন । এছাড়াও, আপনি বলেছিলেন যে এটি একক দায়িত্বের নীতি লঙ্ঘন করে, কিন্তু বাস্তবে অনেকগুলি দাবি আরম্ভ এবং মান
ক্যাশেিং সেইভাবে

আপনার প্রদত্ত উদাহরণে, বিয়োগ অপারেশনের আগে নাল পরীক্ষা করার বিষয়ে কী হবেif(PropertyB == null) return 0;
ইউজার ১1১১১১১১

1
আপনি কি আপনার শেষ অনুচ্ছেদে বিশদভাবে বলতে পারেন, বিশেষত ' বিমূর্ততার স্তর ' বলতে কী বোঝায় ।
user1451111

যদি আমরা কিছু আইও কাজ করে থাকি তবে কোনও আইও ব্যতিক্রম ধরার জন্য বিমূর্ততার স্তরটি যেখানে আমরা কাজটি করছিলাম। সেই মুহূর্তে আমাদের কাছে সমস্ত তথ্য রয়েছে যা আমরা যদি সিদ্ধান্ত নিতে বা ব্যবহারকারীর কাছে একটি বার্তা বাক্স ছুঁড়ে ফেলার বা ডিফল্টগুলির সেট ব্যবহার করে কোনও অবজেক্ট তৈরি করতে চান তবে তা আমাদের নিতে হবে have
স্টিফেন

"আপনার প্রদত্ত উদাহরণে, বিয়োগ অপারেশন করার পূর্বে নাল পরীক্ষা করার বিষয়ে, (সম্পত্তি বি == নাল) 0 ফিরে আসার মতো এটি;" ইশ। এটি কলিং পদ্ধতিটি বলবে যে আমার কাছে এবং থেকে বিয়োগ করার মতো বৈধ জিনিস রয়েছে। অবশ্যই এটি প্রাসঙ্গিক তবে এখানে বেশিরভাগ ক্ষেত্রে আমার ত্রুটি পরীক্ষা করা খারাপ অভ্যাস হবে।
স্টিফেন

6

কোনও অবৈধ অবস্থায় বস্তু স্থাপন এড়াতে আপনি নিক্ষেপ করার মতো কিছু দেখতে পেলেই ছুড়ে দিন। এর অর্থ হ'ল যদি কোনও নাল পয়েন্টারটি পাস হয়ে যায় তবে আপনি তাড়াতাড়ি পরীক্ষা করে নিন এবং কোনও এনপিইকে নিম্ন স্তরে নামার সুযোগ পাওয়ার আগে নিক্ষেপ করুন ।

ত্রুটিটি ঠিক করার জন্য কী করতে হবে তাড়াতাড়ি ধরুন (এটি সাধারণত আপনি যেখানে নিক্ষেপ করেন অন্যথায় আপনি কেবল যদি অন্যথায় ব্যবহার করতে পারেন তবে অন্যথায়) যদি একটি অবৈধ প্যারামিটার পাস হয়ে যায় তবে প্যারামিটার সরবরাহকারী স্তরটি পরিণতিগুলি মোকাবেলা করা উচিত ।


1
আপনি লিখেছেন: শীঘ্রই ছুড়ে দিন, ... শীঘ্রই ধরুন ...! কেন? "তাড়াতাড়ি ফেলুন, দেরিতে ধরুন" এর বিপরীতে এটি সম্পূর্ণ বিপরীত পন্থা।
shylynx

1
@ শাইলিঙ্কস আমি জানি না যে "প্রারম্ভিক নিক্ষেপ কর, দেরিতে ধরা" কোথা থেকে এসেছে তবে এর মান প্রশ্নবিদ্ধ। "দেরী" বলতে আসলে কী বোঝায়? যেখানে কোনও ব্যতিক্রম ধরা (তা যদি আদৌ) সমস্যাটির উপর নির্ভর করে তবে তা বোঝা যায়। কেবলমাত্র পরিষ্কার যে আপনি সমস্যাগুলি সনাক্ত করতে চান (এবং নিক্ষেপ করুন) যত তাড়াতাড়ি সম্ভব।
ডোভাল

2
আমি ধরে নিই "দেরি ধরুন" বোঝার অর্থ ত্রুটি সমাধানের জন্য কী করা উচিত তা জানার আগেই ধরার অভ্যাসের বিপরীতে বোঝানো হয়েছে - উদাহরণস্বরূপ কখনও কখনও আপনি এমন ফাংশন দেখেন যা সমস্ত কিছু ধরা দেয় যাতে তারা কোনও ত্রুটি বার্তা মুদ্রণ করতে পারে এবং তারপরে ব্যতিক্রমটি পুনরায় লিখে ফেলতে পারে।
বাদ পড়েছে এবং

@ হার্কিল: "ক্যাচ লেট" এর একটি সমস্যা হ'ল যদি কোনও ব্যতিক্রম যদি স্তরগুলির দ্বারা বুদবুদ হয়ে থাকে যা সম্পর্কে কিছুই জানে না, তবে কোডের পক্ষে পরিস্থিতি সম্পর্কে কিছু করার মতো পরিস্থিতি হতে পারে তা জানতে সমস্যা হতে পারে যে জিনিসগুলি আসলে যেমন রয়েছে প্রত্যাশিত। একটি সাধারণ উদাহরণ হিসাবে ধরা যাক, যদি কোনও ব্যবহারকারী নথির ফাইলের জন্য কোনও পার্সারকে ডিস্ক থেকে কোনও সিডিসি লোড করা প্রয়োজন হয় এবং এটি পড়ার সময় একটি ডিস্ক ত্রুটি ঘটেছিল, পার্সার নামক কোডটি যদি মনে করে যে ব্যবহারকারী পড়ার সময় কোনও ডিস্ক ত্রুটি ছিল inappropriate নথি।
সুপারক্যাট

4

একটি বৈধ ব্যবসায়ের নিয়ম হ'ল নিম্ন স্তরের সফ্টওয়্যার যদি কোনও মান গণনা করতে ব্যর্থ হয়, তবে ... '

এটি কেবলমাত্র উচ্চ স্তরে প্রকাশ করা যেতে পারে, অন্যথায় নিম্ন স্তরের সফ্টওয়্যার তার নিজস্ব নির্ভুলতার ভিত্তিতে তার আচরণ পরিবর্তন করার চেষ্টা করছে, যা কেবল একটি গিঁটে শেষ হতে চলেছে।


2

প্রথমত, ব্যতিক্রম ব্যতিক্রমী পরিস্থিতিতে for আপনার উদাহরণে, কোনও অঙ্ক অঙ্ক করা যায় না যদি কাঁচা ডেটা উপস্থিত না হয় কারণ এটি লোড করা যায়নি।

আমার অভিজ্ঞতা থেকে, স্ট্যাকটি হাঁটতে গিয়ে ব্যতিক্রম বিমূর্ত করার ভাল অনুশীলন। সাধারণত আপনি যে পয়েন্টগুলি এটি করতে চান তা যখনই কোনও ব্যতিক্রম দুটি স্তরের মধ্যে সীমানা অতিক্রম করে।

ডেটা স্তরে আপনার কাঁচা ডেটা সংগ্রহ করার ক্ষেত্রে যদি কোনও ত্রুটি ঘটে থাকে তবে যে কেউ ডেটা অনুরোধ করেছেন তাকে অবহিত করার জন্য একটি ব্যতিক্রম নিক্ষেপ করুন। এখানে এই সমস্যাটি নিয়ে কাজ করার চেষ্টা করবেন না। হ্যান্ডলিং কোডের জটিলতা খুব বেশি হতে পারে। এছাড়াও ডেটা স্তরটি কেবলমাত্র ডেটা অনুরোধ করার জন্য দায়ী, এটি করার সময় ঘটে যাওয়া ত্রুটিগুলি পরিচালনা করার জন্য নয়। এটিই "তাড়াতাড়ি নিক্ষেপ" বলতে বোঝায় ।

আপনার উদাহরণে ধরার স্তরটি হ'ল পরিষেবা স্তর। ডেটা অ্যাক্সেস লেয়ারের উপরে বসে পরিষেবাটি নিজেই একটি নতুন স্তর। সুতরাং আপনি সেখানে ব্যতিক্রম ধরতে চান। সম্ভবত আপনার পরিষেবাটিতে কিছু ব্যর্থ অবকাঠামো রয়েছে এবং অন্য সংগ্রহস্থল থেকে ডেটা অনুরোধ করার চেষ্টা করা হয়েছে। যদি এটিও ব্যর্থ হয় তবে পরিষেবাটির কলকারী বুঝতে পারে এমন কিছুর মধ্যে ব্যতিক্রমটি মুড়ে রাখুন (এটি যদি কোনও ওয়েব পরিষেবা হয় তবে এটি একটি এসওএপি ফল্ট হতে পারে)। মূল ব্যতিক্রমটি অভ্যন্তরীণ ব্যতিক্রম হিসাবে সেট করুন যাতে পরবর্তী স্তরগুলি যা ভুল হয়েছে ঠিক তা লগ করতে পারে।

সার্ভিস ত্রুটিটি পরিষেবাটি কল করে স্তরের দ্বারা ধরা হতে পারে (উদাহরণস্বরূপ ইউআই)। এবং এটি "দেরিতে ধরা" বলতে বোঝায় । আপনি যদি নিম্ন স্তরে ব্যতিক্রমটি পরিচালনা করতে সক্ষম না হন তবে এটি পুনরায় করুন। যদি শীর্ষ সর্বাধিক স্তর ব্যতিক্রম পরিচালনা করতে না পারে তবে এটি পরিচালনা করুন! এর মধ্যে লগিং বা এটি উপস্থাপন অন্তর্ভুক্ত থাকতে পারে।

আপনার ব্যতিক্রমগুলি পুনর্বিবেচনা করার কারণ (যেমন আরও সাধারণ পরিশ্রমগুলিতে তাদের মোড়ানো দ্বারা উপরে বর্ণিত) এটি হ'ল ব্যবহারকারী খুব সম্ভবত বুঝতে পারে না যে একটি ত্রুটি হয়েছিল কারণ উদাহরণস্বরূপ, একটি পয়েন্টারটি অবৈধ স্মৃতিতে নির্দেশ করেছে। এবং সে যত্ন করে না। তিনি কেবল যত্ন নিচ্ছেন যে পরিষেবাটি দ্বারা চিত্রটি গণনা করা যায়নি এবং এটিই তাঁর কাছে প্রদর্শিত হওয়া উচিত।

আরও এগিয়ে গিয়ে আপনি (আদর্শ বিশ্বের ক্ষেত্রে) ইউআই থেকে পুরোপুরি try/ catchকোড ছেড়ে যেতে পারেন । পরিবর্তে একটি বিশ্বব্যাপী ব্যতিক্রম হ্যান্ডলার ব্যবহার করুন যা সম্ভবত নীচের স্তরগুলির দ্বারা ছুঁড়ে দেওয়া ব্যতিক্রমগুলি বুঝতে সক্ষম হয়, তাদের কিছু লগতে লিখে এবং ত্রুটিযুক্ত বস্তুগুলিতে আবৃত করে যাতে ত্রুটির অর্থপূর্ণ (এবং সম্ভবত স্থানীয়করণ করা) তথ্য থাকে। এই অবজেক্টগুলি সহজেই আপনার ইচ্ছামতো যেকোন ফর্মটিতে (মেসেজ বাক্স, নোটিফিকেশন, মেসেজ টোস্টস ইত্যাদি) ব্যবহারকারীকে উপস্থাপন করা যেতে পারে।


1

সাধারণভাবে প্রথমদিকে ব্যতিক্রম ছুঁড়ে ফেলা একটি ভাল অনুশীলন কারণ আপনি চান না ভাঙ্গা চুক্তিগুলি কোডের মাধ্যমে প্রয়োজনীয়তার চেয়ে আরও প্রবাহিত হয়। উদাহরণস্বরূপ, আপনি যদি কোনও নির্দিষ্ট ফাংশন প্যারামিটারকে ধনাত্মক পূর্ণসংখ্যার আশা করেন তবে কোড স্ট্যাকের অন্য কোনও পরিবর্তনশীল ব্যবহার না করা পর্যন্ত অপেক্ষা করার পরিবর্তে ফাংশন কলের বিন্দুতে আপনার সেই সীমাবদ্ধতাটি প্রয়োগ করা উচিত।

দেরিতে ধরা আমি আসলেই মন্তব্য করতে পারি না কারণ আমার নিজস্ব নিয়ম রয়েছে এবং এটি প্রকল্প থেকে প্রকল্পে পরিবর্তিত হয়। আমি যা করার চেষ্টা করি তা ব্যতিক্রম দুটি গ্রুপে পৃথক করা। একটি কেবল অভ্যন্তরীণ ব্যবহারের জন্য এবং অন্যটি কেবল বাহ্যিক ব্যবহারের জন্য। অভ্যন্তরীণ ব্যতিক্রমগুলি আমার নিজের কোড দ্বারা ধরা পড়ে এবং পরিচালনা করা হয় এবং বাহ্যিক ব্যতিক্রম বলতে বোঝায় যেই কোড আমাকে কল করে by এটি মূলত পরে জিনিসগুলি ধরার একটি ফর্ম তবে এটি যথেষ্ট নয় কারণ এটি অভ্যন্তরীণ কোডে যখন প্রয়োজন হয় তখন আমাকে বিধি থেকে বিচ্যুত করার নমনীয়তা সরবরাহ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.