ව්‍යතිරේක: ඇයි කල්තියා විසි කරන්නේ? ප්‍රමාද වී අල්ලා ගන්නේ ඇයි?


167

හුදකලාව තුළ ව්‍යතිරේකය හැසිරවීම පිළිබඳ සුප‍්‍රසිද්ධ හොඳම භාවිතයන් බොහොමයක් තිබේ. "කළ යුතු හා නොකළ යුතු දේ" මම හොඳින් දනිමි, නමුත් විශාල පරිසරයන් තුළ ඇති හොඳම භාවිතයන් හෝ රටාවන් සම්බන්ධයෙන් එය සංකීර්ණ වේ. "වේලාසනින් විසි කරන්න, ප්‍රමාද වී අල්ලා ගන්න" - මම බොහෝ වාරයක් අසා ඇති අතර එය තවමත් මාව ව්‍යාකූල කරයි.

පහත් මට්ටමේ ස්ථරයක ශුන්‍ය දර්ශක ව්‍යතිරේකයක් විසි කරන්නේ නම් මා කලින් වීසි කර ප්‍රමාද විය යුත්තේ ඇයි? මා එය ඉහළ තට්ටුවකට අල්ලා ගත යුත්තේ ඇයි? ව්‍යාපාර තට්ටුවක් වැනි ඉහළ මට්ටමේ පහත් මට්ටමේ ව්‍යතිරේකයක් අල්ලා ගැනීම මට තේරුමක් නැත. එය එක් එක් ස්ථරයේ උත්සුකයන් උල්ලං to නය කරන බව පෙනේ.

පහත දැක්වෙන තත්වය ගැන සිතා බලන්න:

රූපයක් ගණනය කරන සේවාවක් මා සතුව ඇත. රූපය ගණනය කිරීම සඳහා ගණනය කිරීම සකස් කිරීම සඳහා අමු දත්ත සහ වෙනත් සේවාවන් ලබා ගැනීම සඳහා සේවාව ගබඩාවකට ප්‍රවේශ වේ. දත්ත ලබා ගැනීමේ ස්තරයේ යම් දෙයක් වැරදී ඇත්නම්, මම DataRetrievalException ඉහළ මට්ටමට විසි කළ යුත්තේ ඇයි? ඊට වෙනස්ව, ව්‍යතිරේකය අර්ථවත් ව්‍යතිරේකයකට ඔතා තැබීමට මම කැමැත්තෙමි, උදාහරණයක් ලෙස ගණනය කිරීමේ සේවා එක්සෙප්ෂන්.

වේලාසනින් විසි කරන්න, ප්‍රමාද වී අල්ලා ගන්නේ ඇයි?


111
"ප්‍රමාද වී අල්ලා ගැනීම" පිටුපස ඇති අදහස, හැකි තරම් ප්‍රමාද වී අල්ලා ගැනීම වෙනුවට, හැකි ඉක්මනින් අල්ලා ගැනීමයි. ඔබට ගොනු විග්‍රහකයක් තිබේ නම්, උදාහරණයක් ලෙස, ගොනුවක් හැසිරවීමේ කිසිදු තේරුමක් නොමැත. ඔබ එය කිරීමට අදහස් කරන්නේ කුමක්ද, ඔබේ ප්‍රකෘතිමත් වීමේ මාර්ගය කුමක්ද? එකක් නැත, එබැවින් අල්ලා නොගන්න. ඔබේ ලෙක්සර් වෙත යන්න, ඔබ එහි කුමක් කරන්නේද, ඔබේ වැඩසටහන දිගටම කරගෙන යා හැකි වන පරිදි ඔබ මෙයින් සුවය ලබන්නේ කෙසේද? එයට බැහැ, ව්‍යතිරේකය සමත් වීමට ඉඩ දෙන්න. ඔබේ ස්කෑනරය මෙය හැසිරවිය හැක්කේ කෙසේද? එය කළ නොහැක, එය සමත් වීමට ඉඩ දෙන්න. ඇමතුම් කේතය මෙය හැසිරවිය හැක්කේ කෙසේද? එයට වෙනත් ගොනු මාර්ගයක් උත්සාහ කිරීමට හෝ පරිශීලකයා දැනුවත් කිරීමට හැකිය, එබැවින් අල්ලා ගන්න.
ෆොෂි

17
NullPointerException (NPE යන්නෙන් අදහස් කරන්නේ එයයි) කවදා හෝ අල්ලා ගත යුතු අවස්ථා ඉතා අල්පය; හැකි නම්, එය මුලින් වළක්වා ගත යුතුය. ඔබට NullPointerExceptions තිබේ නම්, ඔබට නිවැරදි කළ යුතු බිඳුණු කේත කිහිපයක් තිබේ. එය බොහෝ විට පහසු විසඳුමක් ද වේ.
ෆිල්

6
කරුණාකර, යාලුවනේ, මෙම ප්‍රශ්නය අනුපිටපතක් ලෙස වසා දැමීමට යෝජනා කිරීමට පෙර, අනෙක් ප්‍රශ්නයට පිළිතුර මෙම ප්‍රශ්නයට හොඳින් පිළිතුරු සපයන්නේ නැතිදැයි පරීක්ෂා කරන්න.
ඩොක් බ්‍රවුන්

1
(Citebot) today.java.net/article/2003/11/20/… මෙය උපුටා දැක්වීමේ මූලාරම්භය නොවේ නම්, කරුණාකර බොහෝ දුරට ඉඩ ඇති මුල් උපුටා දැක්වීම යැයි ඔබ සිතන මූලාශ්‍රය වෙත යොමු කිරීමක් සපයන්න.
rwong

1
මෙම ප්‍රශ්නයට ළඟා වී ඇන්ඩ්‍රොයිඩ් සංවර්ධනය කරන ඕනෑම කෙනෙකුට මතක් කිරීමක් පමණි. ඇන්ඩ්‍රොයිඩ් හි, ව්‍යතිරේකයන් අල්ලාගෙන දේශීයව හැසිරවිය යුතුය - එය මුලින්ම හසු වූ එම ශ්‍රිතයේම. මෙයට හේතුව ව්‍යතිරේකයන් පණිවුඩ හසුරුවන්නන් හරහා ප්‍රචාරය නොකිරීමයි - ඔබගේ යෙදුම සිදුවුවහොත් එය විනාශ වනු ඇත. එබැවින්, ඇන්ඩ්‍රොයිඩ් සංවර්ධනය කිරීමේදී ඔබ මෙම උපදෙස් සඳහන් නොකළ යුතුය.
rwong

Answers:


125

මගේ අත්දැකීම් අනුව, දෝෂ සිදුවන ස්ථානයට ව්‍යතිරේකයන් විසි කිරීම වඩාත් සුදුසුය. ඔබ මෙය කරන්නේ ව්‍යතිරේකය අවුලුවනු ලැබුවේ ඇයිද යන්න පිළිබඳව ඔබ වැඩිපුරම දන්නා ස්ථානය වන බැවිනි.

ව්‍යතිරේකය මඟින් ස්ථර උපස්ථගත වන හෙයින්, අල්ලා ගැනීම සහ නැවත පෙරළීම ව්‍යතිරේකයට අමතර සන්දර්භයක් එක් කිරීමට හොඳ ක්‍රමයකි. මෙයින් අදහස් කරන්නේ වෙනස් ආකාරයේ ව්‍යතිරේකයක් විසි කිරීමයි, නමුත් ඔබ මෙය කරන විට මුල් ව්‍යතිරේකය ඇතුළත් කරන්න.

අවසානයේදී ව්‍යතිරේකය ඔබට කේත ප්‍රවාහය පිළිබඳ තීරණ ගැනීමට හැකි ස්ථරයකට ලඟා වේ (උදා: ක්‍රියාව සඳහා පරිශීලකයාගෙන් විමසීමක්). ඔබ අවසානයේ ව්‍යතිරේකය හැසිරවිය යුතු අතර සාමාන්‍ය ක්‍රියාත්මක කිරීම දිගටම කරගෙන යා යුතු ස්ථානය මෙයයි.

ඔබගේ කේත පදනම සමඟ පුහුණුවීම් සහ පළපුරුද්ද සමඟ දෝෂ සඳහා අතිරේක සන්දර්භයක් එකතු කළ යුත්තේ කවදාදැයි විනිශ්චය කිරීම පහසු වන අතර, ඇත්ත වශයෙන්ම එය වඩාත් සංවේදී වන විට අවසානයේ දෝෂ හැසිරවිය හැකිය.

Catch → Rethrow

ගැටළුව අවබෝධ කර ගැනීම සඳහා සියලු ස්ථර හරහා වැඩ කිරීමට සංවර්ධකයෙකුට ඉතිරි වන තවත් තොරතුරු ඔබට ප්‍රයෝජනවත් ලෙස එකතු කළ හැකි තැනක මෙය කරන්න.

අල්ලන්න le හසුරුවන්න

සුදුසු දේ පිළිබඳ අවසාන තීරණ ගැනීමට ඔබට හැකි නමුත් මෙය මෘදුකාංගය හරහා වෙනස් ක්‍රියාත්මක කිරීමක් සිදු කරන්න.

ඇල්ලීම → දෝෂ නැවත පැමිණීම

මෙය උචිත අවස්ථාවන්හිදී, ව්‍යතිරේකයන් අල්ලා ගැනීම සහ අමතන්නාට දෝෂ අගයක් ලබා දීම කැච් → නැවත ක්‍රියාත්මක කිරීම සඳහා නැවත ප්‍රතිනිර්මාණය කිරීම සඳහා සලකා බැලිය යුතුය.


ඔව්, මම දැනටමත් දන්නා අතර එය ප්‍රශ්නයක් නොවේ, දෝෂය ඇති වන ස්ථානයට මම ව්‍යතිරේකයන් විසි කළ යුතුය. නමුත් ඇයි මම එන්පීඊ අල්ලා ඒ වෙනුවට ස්ටැක්ට්‍රේස් එකට නැගීමට ඉඩ නොදෙන්නේ? මම සෑම විටම NPE අල්ලා එය අර්ථවත් ව්‍යතිරේකයකට ඔතා තබමි. මම DAO-Exception එක සේවයට හෝ ui ස්ථරයට විසි කළ යුත්තේ ඇයිද යන්න මට නොපෙනේ. මම සෑම විටම එය සේවා ස්ථරයට හසු කර අතිරේක සවිස්තරාත්මක තොරතුරු සහිතව සේවා ව්‍යතිරේකයකට ඔතා, සේවාව ඇමතීම අසාර්ථක වූයේ මන්ද.
shylynx

8
@ ෂයිලින්ක්ස් ව්‍යතිරේකයක් අල්ලා පසුව වඩාත් අර්ථවත් ව්‍යතිරේකයක් නැවත සලකා බැලීම හොඳ දෙයකි. ඔබ කළ යුතු නැද්ද වේලාසන ව්යතිරේකයක් නෙත් ඇදගන්නා හා ඉන් ඉක්බිතිව නොවේ එය rethrowing. කියමන අනතුරු ඇඟවීමේ වැරැද්ද නම්, ව්‍යතිරේකය ඉක්මනින් අල්ලා ගැනීම සහ කේතයේ වැරදි ස්ථරයකින් එය හැසිරවීමට උත්සාහ කිරීමයි.
සයිමන් බී

ව්‍යතිරේකය ලැබෙන මොහොතේ සන්දර්භය පැහැදිලි කිරීම ඔබේ කණ්ඩායමේ සංවර්ධකයින්ට ජීවිතය පහසු කරයි. ගැටළුව අවබෝධ කර ගැනීම සඳහා එන්පීඊයට වැඩිදුර විමර්ශනයක් අවශ්‍ය වේ
මයිකල් ෂෝ

4
@ ෂයිලින්ක්ස් කෙනෙකුට ඔබේ ප්‍රශ්නයේ ප්‍රශ්නයක් ඇසිය හැකිය, "ඔබේ කේතයේ ඔබට විසි කළ හැකි කාරණයක් ඇත්තේ ඇයි? ඇයි නරකක් සිදුවී NullPointerExceptionඇත්දැයි හරියටම අමතන්නාට දැන nullගැනීමට හැකි වන පරිදි (සමහර විට IllegalArgumentException) ව්‍යතිරේකයක් (සමහර විට ) පරීක්ෂා කර බලන්න. null" කියමනේ "වේලාසනින් විසි කරන්න" යන කොටස එයින් යෝජනා කරනු ඇතැයි මම විශ්වාස කරමි.
jpmc26

2
pmjpmc මම එන්පීඊය ගත්තේ ස්ථර වටා ඇති උත්සුකයන් සහ ව්‍යතිරේකයන් අවධාරණය කිරීමට උදාහරණයක් ලෙස පමණි. මට එය නීති විරෝධී තර්ක විතර්කයකින් ආදේශ කළ හැකිය.
shylynx

59

ඔබට හැකි ඉක්මනින් ව්‍යතිරේකයක් විසි කිරීමට අවශ්‍ය වන්නේ එය හේතුව සොයා ගැනීම පහසු කරවන බැවිනි. උදාහරණයක් ලෙස, ඇතැම් තර්ක සමඟ අසමත් විය හැකි ක්‍රමයක් සලකා බලන්න. ඔබ තර්ක වලංගු කර ක්‍රමයේ ආරම්භයේදීම අසමත් වුවහොත්, දෝෂය ඇමතුම් කේතයේ ඇති බව ඔබ වහාම දනී. අසමත් වීමට පෙර තර්ක අවශ්‍ය වන තෙක් ඔබ බලා සිටින්නේ නම්, ඔබ එය ක්‍රියාත්මක කිරීම අනුගමනය කළ යුතු අතර දෝෂය ඇමතුම් කේතයේ (නරක තර්කය) තිබේද යන්න හෝ ක්‍රමයට දෝෂයක් තිබේදැයි සොයා බැලිය යුතුය. ඔබ ව්‍යතිරේකය විසි කිරීමට පෙර, එය එහි මූලික හේතුවට සමීප වන අතර දේවල් වැරදුනේ කොතැනදැයි සොයා ගැනීම පහසුය.

ව්‍යතිරේකයන් ඉහළ මට්ටම් වලදී හැසිරවීමට හේතුව වන්නේ දෝෂය හැසිරවීමට සුදුසු ක්‍රියාමාර්ගය කුමක්දැයි පහළ මට්ටම් නොදන්නා බැවිනි. ඇත්ත වශයෙන්ම, ඇමතුම් කේතය යනු කුමක්ද යන්න මත පදනම්ව එකම දෝෂයක් හැසිරවීමට සුදුසු ක්‍රම කිහිපයක් තිබිය හැකිය. උදාහරණයක් ලෙස ගොනුවක් විවෘත කිරීම ගන්න. ඔබ වින්‍යාස ගොනුවක් විවෘත කිරීමට උත්සාහ කළත් එය එහි නොමැති නම්, ව්‍යතිරේකය නොසලකා හැර පෙරනිමි වින්‍යාසය සමඟ ඉදිරියට යාම සුදුසු ප්‍රතිචාරයක් විය හැකිය. ඔබ වැඩසටහන ක්‍රියාත්මක කිරීමට අත්‍යවශ්‍ය පුද්ගලික ගොනුවක් විවෘත කරන්නේ නම් සහ එය කෙසේ හෝ මග හැරී ඇත්නම්, ඔබේ එකම විකල්පය වන්නේ වැඩසටහන වසා දැමීමයි.

ව්‍යතිරේකයන් නිවැරදි වර්ග වලට ඔතා ගැනීම තනිකරම විකලාංග සැලකිල්ලකි.


1
විවිධ මට්ටම් වැදගත් වන්නේ ඇයිද යන්න පැහැදිලි කිරීම සඳහා +1. ගොනු පද්ධති දෝෂය පිළිබඳ විශිෂ්ට උදාහරණය.
ජුවාන් කාලෝස් කොටෝ

හොඳ පිළිතුරක්, මම ඇත්තටම එම ගොනු පද්ධති උදාහරණයට කැමතියි. මෙම මූලධර්ම අල්ලා ගැනීමට ඔබට හොඳ සම්පතක් මට පැවසිය හැකිද?
සුරාජ් ජේන්

25

තවත් සමහරු වේලාසනින් විසි කළ යුත්තේ මන්දැයි සාරාංශ කොට ඇත. ඒ වෙනුවට ප්‍රමාද කොටස අල්ලා ගන්නේ ඇයිද යන්න පිළිබඳව අවධානය යොමු කිරීමට මට ඉඩ දෙන්න, සඳහා මගේ රසය පිළිබඳ තෘප්තිමත් පැහැදිලි කිරීමක් මා දැක නැත.

එසේ නම් ඇයි?

ව්‍යතිරේකයන් මුලින් පවතින්නේ මන්ද යන්න පිළිබඳව තරමක් ව්‍යාකූලත්වයක් ඇති බව පෙනේ. මෙහි විශාල රහස බෙදා ගැනීමට මට ඉඩ දෙන්න: ව්‍යතිරේකවලට හේතුව සහ ව්‍යතිරේකය හැසිරවීම ... උපුටා ගැනීම .

ඔබ මේ වගේ කේත දැක තිබේද:

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

ව්‍යතිරේක භාවිතා කළ යුත්තේ එසේ නොවේ. ඉහත සඳහන් කේත සැබෑ ජීවිතයේ පවතී, නමුත් ඒවා බොහෝ දුරට අපගමනය වන අතර ඇත්ත වශයෙන්ම ව්‍යතිරේකය (pun) වේ. නිදසුනක් ලෙස බෙදීමේ අර්ථ දැක්වීම පිරිසිදු ගණිතයේ පවා කොන්දේසි සහිත ය: ආදාන වසම සීමා කිරීම සඳහා ශුන්‍යයේ සුවිශේෂී අවස්ථාව හැසිරවිය යුත්තේ “ඇමතුම් කේතය” ය. එය කැතයි. එය සැමවිටම අමතන්නාට වේදනාවකි. කෙසේ වෙතත්, එවැනි තත්වයන් සඳහා චෙක්-එවකට කළ යුතු රටාව යනු ස්වාභාවික මාර්ගයයි:

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

විකල්පයක් ලෙස, ඔබට මේ ආකාරයට OOP ශෛලිය මත සම්පූර්ණ කමාන්ඩෝ යා හැකිය:

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සැමවිටම පාහේ වැරදි දෙයකි.

දැන් සමහර පුද්ගලයින් ක්‍රමයේ / ක්‍රියාකාරී අත්සනෙහි සුවිශේෂී අවස්ථා දැකීමට අවශ්‍ය යැයි පවසන අය සිටිති, එනම් ප්‍රතිදාන වසම පැහැදිලිව දීර් extend කිරීම . පරීක්ෂා කළ ව්‍යතිරේකයන්ට කැමති අය ඔවුන් ය . ඇත්ත වශයෙන්ම, ප්‍රතිදාන වසම වෙනස් කිරීම ඕනෑම සෘජු ඇමතුම් කේතයක් අනුවර්තනය වීමට බල කළ යුතු අතර, එය සැබවින්ම පරික්ෂා කළ ව්‍යතිරේකයන් සමඟ සාක්ෂාත් කර ගනු ඇත. නමුත් ඒ සඳහා ඔබට ව්‍යතිරේක අවශ්‍ය නොවේ! ඔබට 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.");
    }
}

ඉහත සඳහන් අරමුණු සඳහා තාක්ෂණික ව්‍යතිරේක භාවිතා කළ හැකි නමුත් මෙහි කාරණය මෙයයි: එවැනි භාවිතය සඳහා ව්‍යතිරේකයන් නොපවතී . ව්‍යතිරේකයන් යනු ගැති සාරාංශයකි. ව්‍යතිරේකය යනු අවිනිශ්චිතතාවයයි. ව්‍යතිරේකයන් මඟින් සෘජු සේවාදායක ගිවිසුම් කඩ නොකර " ප්‍රති come ල " වසම දීර් extend කිරීමට සහ දෝෂ හැසිරවීම "වෙනත් තැනකට" කල් දැමීමට ඉඩ දෙයි . ඔබේ කේතය එකම කේතයේ සෘජු අමතන්නන් විසින් හසුරුවනු ලබන ව්‍යතිරේකයන් විසි කරන්නේ නම්, අතර කිසිදු සාරාංශයක් නොමැතිව, ඔබ එය කරන්නේ වැරදියි

ප්‍රමාද වන්නේ කෙසේද?

ඉතින් මෙන්න අපි. ඉහත අවස්ථා වලදී ව්‍යතිරේක භාවිතා කිරීම යනු ව්‍යතිරේක භාවිතා කළ යුතු ආකාරය නොවන බව පෙන්වීමට මම මගේ මාර්ගය තර්ක කර ඇත්තෙමි. ව්‍යතිරේකය හැසිරවීම මගින් ඉදිරිපත් කරන වියුක්ත කිරීම සහ නිරවද්‍යතාවය අත්‍යවශ්‍ය වන අව්‍යාජ භාවිත නඩුවක් පවතී. එවැනි භාවිතය අවබෝධ කර ගැනීම ප්‍රමාද වූ නිර්දේශය තේරුම් ගැනීමට උපකාරී වේ.

එම භාවිත අවස්ථාව මෙයයි: සම්පත් සාරාංශවලට එරෙහිව වැඩසටහන්කරණය ...

ඔව්, ව්‍යාපාර තර්කනය ක්‍රමලේඛනය කළ යුත්තේ වියුක්තයන්ට එරෙහිව මිස ස්ථිර ලෙස ක්‍රියාත්මක කිරීමට නොවේ. ඉහළ මට්ටමේ IOC "රැහැන්" ​​කේතය මඟින් සම්පත් වියුක්ත කිරීම් ස්ථිර ලෙස ක්‍රියාත්මක කිරීම ක්ෂණිකව ක්‍රියාත්මක වන අතර ඒවා ව්‍යාපාර තර්කනයට යොමු කරයි. මෙහි අලුත් දෙයක් නැත. එහෙත් එම සම්පත් සාරාංශවල සංයුක්ත ක්‍රියාවට නැංවීම ඔවුන්ගේම ක්‍රියාත්මක කිරීමේ විශේෂිත ව්‍යතිරේකයන් විසි කිරීමට ඉඩ තිබේ.

එම ක්‍රියාත්මක කිරීමේ විශේෂිත ව්‍යතිරේකයන් හැසිරවිය හැක්කේ කාටද? එවිට ව්‍යාපාර තර්කනයේ කිසියම් සම්පත් විශේෂිත ව්‍යතිරේකයක් හැසිරවිය හැකිද? නැහැ, එසේ නොවේ. ව්‍යාපාර තර්කනය වියුක්තකරණයට එරෙහිව වැඩසටහන්ගත කර ඇති අතර එමඟින් එම ක්‍රියාත්මක කිරීමේ විශේෂිත ව්‍යතිරේක තොරතුරු පිළිබඳ දැනුම බැහැර කරනු ලැබේ.

"ආහා!", ඔබට මෙසේ පැවසිය හැකිය: "නමුත් අපට ව්‍යතිරේකයන් උප වර්ගීකරණය කර ව්‍යතිරේක ධූරාවලියක් නිර්මාණය කළ හැක්කේ එබැවිනි" ( ස්ප්‍රිං මහතා බලන්න!). මම ඔබට කියන්නම්, එය වැරැද්දකි. පළමුවෙන්ම, ඕඕපී පිළිබඳ සෑම සාධාරණ පොතක්ම පවසන්නේ කොන්ක්‍රීට් උරුමය නරක බවය, නමුත් කෙසේ හෝ ජේවීඑම් හි මෙම මූලික අංගය, ව්‍යතිරේකය හැසිරවීම කොන්ක්‍රීට් උරුමය සමඟ සමීපව බැඳී ඇත. උත්ප‍්‍රාසාත්මක ලෙස, වැඩ කරන ජේවීඑම් සමඟ අත්දැකීම් ලබා ගැනීමට පෙර ජෝෂුවා බ්ලොච්ට ඔහුගේ Java ලදායී ජාවා පොත ලිවීමට නොහැකි විය. එය ඊළඟ පරම්පරාවට "උගත් පාඩම්" පොතකි. දෙවනුව, සහ වඩා වැදගත් දෙය නම්, ඔබ ඉහළ මට්ටමේ ව්‍යතිරේකයක් අල්ලා ගන්නේ නම් ඔබ එය හසුරුවන්නේ කෙසේද?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);
    }
}

දැන් මා සමඟ ඉවසන්න. ඉහත කේතය වන්නේ සරල. ඔබට IOC බහාලුම් කළමණාකරන සම්පත් වල විවිධ විෂය පථයන් සහිත ව්‍යවසාය යෙදුමක් / වෙබ් බහාලුමක් ඇති බව ඔබට පැවසිය හැකිය, ඔබට ස්වයංක්‍රීයව නැවත උත්සාහ කිරීම සහ සැසිය නැවත ආරම්භ කිරීම හෝ විෂය පථ සම්පත් ඉල්ලීම යනාදිය අවශ්‍ය වේ. පහළ මට්ටමේ විෂය පථයන්හි රැහැන් තර්කනයට වියුක්ත කර්මාන්තශාලා ලබා දිය හැකිය. සම්පත් නිර්මාණය කිරීම, එබැවින් නිශ්චිත ක්‍රියාත්මක කිරීම් පිළිබඳව නොදැන සිටීම. පහළ මට්ටමේ සම්පත් වලට විසි කළ හැකි ව්‍යතිරේකයන් මොනවාදැයි දැනගත හැක්කේ ඉහළ මට්ටමේ විෂය පථයන්ට පමණි. දැන් ඉන්න!

අවාසනාවකට මෙන්, ව්‍යතිරේකයන් මඟින් ඇමතුම් තොගයට ඉහළින් ගමන් කිරීමට පමණක් ඉඩ ලබා දෙන අතර, ඒවායේ විවිධ කාදිනල්තා සහිත විවිධ විෂය පථයන් සාමාන්‍යයෙන් විවිධ නූල් මත ධාවනය වේ. ව්‍යතිරේකයන් සමඟ ඒ හරහා සන්නිවේදනය කිරීමට ක්‍රමයක් නොමැත. අපට මෙහි වඩා බලවත් දෙයක් අවශ්‍යයි. පිළිතුර: අසමකාලීක පණිවිඩය සම්මත . සෑම ව්‍යතිරේකයක්ම පහළ මට්ටමේ විෂය පථයේ මුල අල්ලා ගන්න. කිසිවක් නොසලකා හරින්න, කිසිවක් ලිස්සා යාමට ඉඩ නොදෙන්න. මෙය වත්මන් විෂය පථයේ ඇමතුම් තොගයේ ඇති සියලුම සම්පත් වසා දමා බැහැර කරනු ඇත. ඔබ කොන්ක්‍රීට් දන්නා මට්ටමට ළඟා වන තුරු, ව්‍යතිරේක හැසිරවීමේ චර්යාවේ පණිවුඩ පෝලිම් / නාලිකා භාවිතා කිරීමෙන් දෝෂ පණිවිඩ ඉහළට ගෙන යන්න. එය හැසිරවිය යුතු ආකාරය දන්නා පුද්ගලයා එයයි.

සුමා සුමාරම්

එබැවින් මගේ අර්ථ නිරූපණයට අනුව ප්‍රමාදයන් අල්ලා ගැනීම වඩාත් පහසු ස්ථානයක ව්‍යතිරේකයන් අල්ලා ගැනීම ඔබ කොතැනකවත් නොපැමිණියේ කොතැනද ? වේලාසනින් අල්ලා නොගන්න! ඔබ කොන්ක්‍රීට් ව්‍යතිරේකය නිර්මාණය කරන ස්ථරයේ ව්‍යතිරේකයන් අල්ලා ගන්න, සම්පත් වියුක්ත කිරීම්, වියුක්තයන්ගේ කොන්ක්‍රීට් දන්නා ස්තරය . "රැහැන්" ​​ස්ථරය.

HTH. සුබ කේතීකරණයක්!


අතුරුමුහුණත සපයන කේතය අතුරු මුහුණත භාවිතා කරන කේතයට වඩා වැරදිය හැකි දේ ගැන වැඩි යමක් දැන ගනු ඇති බව ඔබ නිවැරදියි, නමුත් ක්‍රමයක් එකම අතුරුමුහුණත් වර්ගයේ සම්පත් දෙකක් භාවිතා කරයි යැයි සිතමු. නැතහොත් එම සම්පත් වලින් එකක්, එහි නිර්මාතෘ නොදන්නා ක්‍රියාත්මක කිරීමේ විස්තරයක් ලෙස, එකම වර්ගයේ වෙනත් කැදැලි සම්පත් භාවිතා කරන්නේ නම්? ව්‍යාපාර ස්ථරය විසි කිරීම WrappedFirstResourceExceptionහෝ WrappedSecondResourceExceptionගැටළුවේ මූලික හේතුව බැලීමට “රැහැන්” ස්තරය එම ව්‍යතිරේකය තුළ බැලීමට අවශ්‍ය වේ ...
සුපර් කැට්

... icky විය හැකිය, නමුත් ඕනෑම FailingInputResourceව්‍යතිරේකයක් සමඟ මෙහෙයුමක ප්‍රති result ලයක් වනු ඇතැයි උපකල්පනය කරනවාට වඩා හොඳ බව පෙනේ in1. ඇත්ත වශයෙන්ම, බොහෝ අවස්ථාවන්හීදී නිවැරදි ප්‍රවේශය වනුයේ රැහැන් ස්ථරය ව්‍යතිරේක-හැසිරවීමේ වස්තුවක් පසුකර යාම සහ ව්‍යාපාර ස්ථරයට catchඑම වස්තුවේ handleExceptionක්‍රමයට ආයාචනා කිරීම ය . එම ක්‍රමයට පෙරනිමි දත්ත නැවත ලබා දීමට හෝ සැපයීමට හෝ "අත්හිටුවීම / නැවත උත්සාහ කිරීම / අසමත් වීම" පිළිබඳ විමසුමක් ඉදිරිපත් කළ හැකි අතර යෙදුමට අවශ්‍ය දේ මත පදනම්ව කුමක් කළ යුතුද යන්න තීරණය කිරීමට ක්‍රියාකරුට ඉඩ දෙන්න.
සුපර් කැට්

up සුපර්කැට් ඔබ කියන දේ මට තේරෙනවා. කොන්ක්‍රීට් සම්පත් ක්‍රියාත්මක කිරීම එයට විසි කළ හැකි ව්‍යතිරේකයන් දැන ගැනීම වගකිව යුතු යැයි මම කියමි. එයට සෑම දෙයක්ම නියම කළ යුතු නැත (ඊනියා නිර්වචනය නොකළ හැසිරීමක් ඇත ), නමුත් එය අවිනිශ්චිතතාවයක් නොමැති බව සහතික කළ යුතුය. එසේම, පරීක්ෂා නොකළ ධාවන කාල ව්‍යතිරේකයන් ලේඛනගත කළ යුතුය. එය ප්‍රලේඛනයට පටහැනි නම් එය දෝෂයකි. ඇමතුම් කේතය ව්‍යතිරේකයක් පිළිබඳ සංවේදී යමක් කිරීමට අපේක්ෂා කරන්නේ නම්, අවම අවම වන්නේ සම්පත UnrecoverableInternalExceptionHTTP 500 දෝෂ කේතයකට සමාන ඒවායින් සමහරක් ඔතා තිබීමයි.
ඩැනියෙල් ඩිනීස්

upsupercat වින්‍යාසගත කළ හැකි දෝෂ හසුරුවන්නන් පිළිබඳ ඔබේ යෝජනාව ගැන: හරියටම! මගේ අවසාන උදාහරණයේ දී දෝෂ හැසිරවීමේ තර්කනය දෘඩ කේත කර ඇති අතර එය ස්ථිතික doMyBusinessක්‍රමය ලෙස හැඳින්වේ . මෙය සංක්ෂිප්ත භාවය සඳහා වූ අතර එය වඩාත් ගතික බවට පත් කිරීමට පරිපූර්ණ ලෙස හැකි ය. එවැනි Handlerපංතියක් සමහර ආදාන / ප්‍රතිදාන සම්පත් සමඟ ක්ෂණිකව handleක්‍රියාත්මක වන අතර පන්තියක් ක්‍රියාත්මක කරන ක්‍රමයක් ReusableBusinessLogicInterfaceඇත. ඔබට ඊට ඉහළින් කොතැනක හෝ රැහැන් ස්ථරයේ විවිධ හසුරුවන්නන්, සම්පත් සහ ව්‍යාපාර තර්කන ක්‍රියාත්මක කිරීම් ඒකාබද්ධ කිරීමට / වින්‍යාස කිරීමට හැකිය.
ඩැනියෙල් ඩිනීස්

පූර්ණ සංඛ්‍යා බෙදීමට අවසර තිබේද යන්න ඔබගේ කේතය පරීක්ෂා කිරීම වැරදිය. ශුන්‍යයෙන් බෙදීම එකම ගැටළුව නොවේ. MININT / -1 අනෙක් ගැටළුවයි.
gnasher729

10

මෙම ප්‍රශ්නයට නිසි ලෙස පිළිතුරු සැපයීම සඳහා, අපි අඩියක් පස්සට තබා ඊටත් වඩා මූලික ප්‍රශ්නයක් අසමු.

අපට මුලින් ම ව්‍යතිරේකයන් ඇත්තේ මන්ද?

අපෙන් ඉල්ලා සිටින දේ අපට කළ නොහැකි බව අපගේ ක්‍රමවේදය අමතන්නාට දැන ගැනීමට අපි ව්‍යතිරේකයන් විසි කරමු. ව්‍යතිරේකයේ වර්ගය පැහැදිලි කරන්නේ අපට කිරීමට අවශ්‍ය දේ අපට කළ නොහැක්කේ මන්ද යන්නයි.

අපි යම් කේතයක් දෙස බලමු:

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

මෙම කේතයට ශුන්‍ය නම් පැහැදිලිවම ශුන්‍ය යොමු ව්‍යතිරේකයක් විසි කළ හැකිය PropertyB. මෙම තත්වය සඳහා "නිවැරදි කිරීම" සඳහා අපට මෙම අවස්ථාවේදී කළ හැකි කරුණු දෙකක් තිබේ. අපිට පුළුවන් වුණා:

  • PropertyB අප සතුව නොමැති නම් ස්වයංක්‍රීයව නිර්මාණය කරන්න; හෝ
  • ව්‍යතිරේකය ඇමතුම් ක්‍රමයට බුබුලට ඉඩ දෙන්න.

PropertyB මෙහි නිර්මාණය කිරීම ඉතා භයානක විය හැකිය. PropertyB නිර්මාණය කිරීමට මෙම ක්‍රමයට ඇති හේතුව කුමක්ද? නිසැකවම මෙය තනි වගකීම් මූලධර්මය උල්ලං would නය කරනු ඇත. PropertyB මෙහි නොපවතී නම්, එයින් ඇඟවෙන්නේ යම් දෙයක් වැරදී ඇති බවයි. අර්ධ වශයෙන් ඉදිකරන ලද වස්තුවක් මත මෙම ක්‍රමය කැඳවනු ලැබේ, නැතහොත් PropertyB වැරදියට අහෝසි කිරීමට සකසා ඇත. PropertyB මෙහි නිර්මාණය කිරීමෙන්, දත්ත දූෂණයට හේතු වන දෝෂයක් වැනි පසුකාලීනව අපට දෂ්ට කළ හැකි වඩා විශාල දෝෂයක් සැඟවිය හැක.

ඒ වෙනුවට, අපි ශුන්‍ය යොමු බුබුල ඉහළට ඔසවා තැබුවහොත්, මෙම ක්‍රමය හැඳින්වූ සංවර්ධකයාට, හැකි ඉක්මනින් යමක් වැරදී ඇති බව දැන ගැනීමට අපි ඉඩ දෙමු. මෙම ක්‍රමය ඇමතීමේ වැදගත් පූර්ව කොන්දේසියක් මග හැරී ඇත.

ඒ නිසා ඇත්ත වශයෙන්ම, අපි කලින් විසි කරන්නේ එය අපගේ උත්සුකයන් වඩා හොඳින් වෙන් කරන බැවිනි. දෝෂයක් සිදු වූ විගසම, අපි ඒ ගැන උඩරට සංවර්ධකයින්ට දැන ගැනීමට සලස්වන්නෙමු.

අප "ප්‍රමාද වන්නේ" ඇයි යන්න වෙනස් කතාවකි. අපට ප්‍රමාද වීමට අවශ්‍ය නැත, ගැටලුව නිසි ලෙස හසුරුවන්නේ කෙසේදැයි අප දන්නා තරමටම අල්ලා ගැනීමට අපට අවශ්‍යය. සමහර විට මෙය පසුව වියුක්ත ස්ථර පහළොවක් වනු ඇති අතර සමහර විට මෙය මැවීමේ අවස්ථාව වේ.

කාරණය නම්, ව්‍යතිරේකය නිසි ලෙස හැසිරවීමට අවශ්‍ය සියලු තොරතුරු අප සතුව ඇති අවස්ථාවක දී ව්‍යතිරේකය හැසිරවීමට අපට ඉඩ සලසන සාරාංශයේ ස්ථරයේ දී ව්‍යතිරේකය අල්ලා ගැනීමට අපට අවශ්‍ය ය.


මම හිතන්නේ ඔබ උඩු යටිකුරු සංවර්ධකයින් භාවිතා කරන්නේ වැරදි අර්ථයෙන්. එසේම, එය තනි වගකීම් මූලධර්මයක්
උල්ලං lates නය කිරීමක්

ඔබ ලබා දී ඇති උදාහරණයේ දී, අඩුකිරීමේ ක්‍රියාවලියට පෙර ශුන්‍යය පරීක්ෂා කිරීම ගැන කුමක් කිව if(PropertyB == null) return 0;
හැකිද

1
ඔබ ද විශේෂයෙන් මගින් ඔබ අදහස් කරන්නේ කුමක් ද, ඔබේ අවසන් ඡේදය විග්රහය වියුක්තීකරණය තට්ටුවක් .
user1451111

අප යම් IO වැඩක් කරන්නේ නම්, IO ව්‍යතිරේකයක් අල්ලා ගැනීම සඳහා වියුක්ත කිරීමේ තට්ටුව වනුයේ අප එම කාර්යය කරන ස්ථානයයි. එම අවස්ථාවෙහිදී, පරිශීලකයාට නැවත උත්සාහ කිරීමට හෝ පණිවිඩ පෙට්ටියක් විසි කිරීමට හෝ පෙරනිමි කට්ටලයක් භාවිතා කරමින් වස්තුවක් නිර්මාණය කිරීමට අවශ්‍ය දැයි තීරණය කිරීමට අවශ්‍ය සියලු තොරතුරු අප සතුව ඇත.
ස්ටීවන්

"ඔබ ලබා දී ඇති උදාහරණයේ දී, අඩු කිරීමේ ක්‍රියාවලියට පෙර ශුන්‍යය පරීක්ෂා කිරීම ගැන කුමක් කිව හැකිද? (PropertyB == null) ආපසු 0 නම්;" යක්. එය ඇමතුම් ක්‍රමයට කියනුයේ මට සහ ඉන් අඩු කිරීමට වලංගු දේවල් ඇති බවය. ඇත්ත වශයෙන්ම මෙය සන්දර්භමය නමුත් බොහෝ අවස්ථාවලදී මගේ දෝෂ පරීක්ෂා කිරීම නරක පුරුද්දකි.
ස්ටීවන්

6

අවලංගු තත්වයකට වස්තූන් දැමීම වළක්වා ගැනීම සඳහා විසි කිරීමට වටින දෙයක් ඔබ දුටු විගස විසි කරන්න. මෙහි අර්ථය නම්, ශුන්‍ය දර්ශකයක් සම්මත වුවහොත් ඔබ එය කලින් පරීක්ෂා කර NPE එකක් පහත් මට්ටමට ඇද දැමීමට අවස්ථාවක් ලැබීමට පෙර විසි කරන්න .

දෝෂය නිවැරදි කිරීම සඳහා කුමක් කළ යුතු දැයි ඔබ දැනගත් විගසම අල්ලා ගන්න (මෙය සාමාන්‍යයෙන් ඔබ විසි කරන තැන නොවේ නම් ඔබට වෙනත් ආකාරයකින් භාවිතා කළ හැකිය), අවලංගු පරාමිතියක් සම්මත වුවහොත් පරාමිතිය සැපයූ ස්තරය ප්‍රතිවිපාක සමඟ කටයුතු කළ යුතුය. .


1
ඔබ ලිව්වේ: ඉක්මනින් විසි කරන්න, ... ඉක්මනින් අල්ලා ගන්න ...! මන්ද? එය "කලින් විසි කරන්න, ප්‍රමාද වී අල්ලා ගන්න" යන්නට හාත්පසින්ම වෙනස් ප්‍රවේශයකි.
shylynx

1
yl ෂයිලින්ක්ස් "වේලාසනින් විසි කරන්න, ප්‍රමාද වී අල්ලා ගන්න" කොහෙන්දැයි මම නොදනිමි, නමුත් එහි වටිනාකම සැක සහිතය. "ප්‍රමාද" අල්ලා ගැනීම යන්නෙන් අදහස් කරන්නේ කුමක්ද? ව්‍යතිරේකයක් අල්ලා ගැනීම අර්ථවත් වන තැන (කිසිසේත් නම්) ගැටළුව මත රඳා පවතී. පැහැදිලිව පෙනෙන එකම දෙය නම් ඔබට හැකි ඉක්මනින් ගැටළු හඳුනා ගැනීමට (සහ විසි කිරීමට) අවශ්‍ය වීමයි.
ඩොවල්

2
"ප්‍රමාද වී අල්ලා ගැනීම" යන්නෙන් අදහස් කරන්නේ ඔබ දෝෂය නිවැරදි කිරීමට කුමක් කළ යුතු දැයි දැන ගැනීමට පෙර අල්ලා ගැනීමේ පුරුද්දට වඩා වෙනස් බවය - උදා: සමහර විට ඔබ සෑම දෙයක්ම අල්ලා ගන්නා කාර්යයන් දකින බැවින් ඔවුන්ට දෝෂ පණිවිඩයක් මුද්‍රණය කර ව්‍යතිරේකය නැවත සලකා බැලිය හැකිය.

Ur හර්කයිල්: “ප්‍රමාද වී අල්ලා ගැනීම” පිළිබඳ ගැටළුවක් නම්, ව්‍යතිරේකයක් ඒ ගැන කිසිවක් නොදන්නා ස්ථර හරහා ඉහළට එන්නේ නම්, තත්වය ගැන යමක් කිරීමට හැකියාවක් ඇති කේතයකට එය දුෂ්කර විය හැකිය. අපේක්ෂිත. සරල උදාහරණයක් ලෙස, පරිශීලක ලේඛන ගොනුවක් සඳහා විග්‍රහකයකුට තැටියෙන් CODEC පැටවීමට අවශ්‍ය නම් සහ එය කියවන විට තැටියේ දෝෂයක් ඇතිවේ යැයි සිතමු. ලේඛනය.
සුපර් කැට්

4

වලංගු ව්‍යාපාර රීතියක් වන්නේ 'පහළ මට්ටමේ මෘදුකාංගයක් වටිනාකමක් ගණනය කිරීමට අපොහොසත් වුවහොත් ...

මෙය ප්‍රකාශ කළ හැක්කේ ඉහළ මට්ටමින් පමණි, එසේ නොමැති නම් පහළ මට්ටමේ මෘදුකාංගය එහි හැසිරීම නිවැරදි කිරීමට උත්සාහ කරන්නේ එහි නිවැරදි භාවය මත වන අතර එය අවසන් වන්නේ ගැටයකින් පමණි.


2

පළමුවෙන්ම, ව්යතිරේක යනු සුවිශේෂී අවස්ථාවන් සඳහා ය. ඔබේ උදාහරණයේ දී, අමු දත්ත පැටවීමට නොහැකි නිසා එහි නොමැති නම් කිසිදු සංඛ්‍යාවක් ගණනය කළ නොහැක.

මගේ අත්දැකීම් අනුව, තොගයේ ඉහළට ඇවිදීමේදී වියුක්ත ව්‍යතිරේකයන් කිරීම හොඳ පුරුද්දකි. සාමාන්‍යයෙන් ඔබට මෙය කිරීමට අවශ්‍ය ස්ථාන වන්නේ ව්‍යතිරේකයක් ස්ථර දෙකක් අතර සීමාව ඉක්මවා යන සෑම අවස්ථාවකම ය.

දත්ත ස්ථරයේ ඔබේ අමු දත්ත එක්රැස් කිරීමේ දෝෂයක් තිබේ නම්, දත්ත ඉල්ලූ අයෙකුට දැනුම් දීමට ව්‍යතිරේකයක් දමන්න. මෙම ගැටළුව විසඳා ගැනීමට උත්සාහ නොකරන්න. හැසිරවීමේ කේතයේ සංකීර්ණතාව ඉතා ඉහළ විය හැකිය. දත්ත ස්තරය වගකිව යුත්තේ දත්ත ඉල්ලීම සඳහා මිස මෙය සිදු කිරීමේදී සිදුවන දෝෂ හැසිරවීමට නොවේ. "වේලාසනින් විසි කිරීම" යන්නෙන් අදහස් කරන්නේ මෙයයි .

ඔබේ උදාහරණයේ දී අල්ලා ගැනීමේ ස්තරය සේවා ස්ථරය වේ. සේවාව නව ස්ථරයක් වන අතර දත්ත ප්‍රවේශ ස්ථරයට ඉහළින් වාඩි වී සිටී. එබැවින් ඔබට එහි ව්‍යතිරේකය අල්ලා ගැනීමට අවශ්‍යය. සමහර විට ඔබේ සේවාවට කිසියම් අසාර්ථක යටිතල ව්‍යුහයක් ඇති අතර වෙනත් ගබඩාවකින් දත්ත ඉල්ලා සිටීමට උත්සාහ කරයි. මෙයද අසමත් වුවහොත්, සේවාව අමතන්නා තේරුම් ගන්නා දෙයක් තුළ ව්‍යතිරේකය ඔතා තබන්න (එය වෙබ් සේවාවක් නම් මෙය SOAP දෝෂයක් විය හැකිය). මුල් ව්‍යතිරේකය අභ්‍යන්තර ව්‍යතිරේකයක් ලෙස සකසන්න, එවිට පසු ස්ථර වල වැරැද්ද හරියටම ලොග් විය හැක.

සේවාව කැඳවීමේ ස්තරය මගින් සේවා දෝෂය හඳුනාගත හැකිය (උදාහරණයක් ලෙස UI). "ප්‍රමාද වී අල්ලා ගැනීම" යන්නෙන් අදහස් කරන්නේ මෙයයි . පහළ ස්ථරයකින් ව්‍යතිරේකය හැසිරවීමට ඔබට නොහැකි නම්, එය නැවත පෙරළන්න. ඉහළම ස්ථරයට ව්‍යතිරේකය හැසිරවිය නොහැකි නම්, එය හසුරුවන්න! ලොග් වීම හෝ ඉදිරිපත් කිරීම මෙයට ඇතුළත් විය හැකිය.

ඔබ ව්‍යතිරේකයන් නැවත සලකා බැලීමට හේතුව (ඉහත විස්තර කර ඇති ආකාරයට ඒවා වඩාත් පොදු ක්‍රියාකාරකම් වලින් ඔතා), දෝෂයක් ඇති බව පරිශීලකයාට තේරුම් ගැනීමට නොහැකි වීම, උදාහරණයක් ලෙස, දර්ශකයක් අවලංගු මතකය වෙත යොමු කර ඇත. ඔහු ගණන් ගන්නේ නැහැ. ඔහු සැලකිලිමත් වන්නේ සේවාව මගින් එම සංඛ්‍යාව ගණනය කළ නොහැකි බවත් එය ඔහුට පෙන්විය යුතු තොරතුරු බවත් ය.

ඔබට ඉදිරියට යා හැකිය (පරමාදර්ශී ලෝකයක) UI වෙතින් කේත try/ catchකේතය සම්පූර්ණයෙන්ම අත්හරින්න . ඒ වෙනුවට පහළ ස්ථර මගින් විසි කළ හැකි ව්‍යතිරේක තේරුම් ගැනීමට හැකි ගෝලීය ව්‍යතිරේක හසුරුවන්නෙකු භාවිතා කරන්න, ඒවා යම් ලොගයකට ලියා දෝෂයේ අර්ථවත් (හා සමහර විට දේශීයකරණය කළ) තොරතුරු අඩංගු වැරදි වස්තු තුළට ඔතා. එම වස්තූන් ඔබ කැමති ඕනෑම ආකාරයකින් පරිශීලකයාට පහසුවෙන් ඉදිරිපත් කළ හැකිය (පණිවිඩ පෙට්ටි, දැනුම්දීම්, පණිවිඩ ටෝස්ට් සහ යනාදිය).


1

සාමාන්‍යයෙන් ව්‍යතිරේකයන් විසි කිරීම හොඳ පුරුද්දකි, මන්ද කැඩුණු කොන්ත්‍රාත්තු අවශ්‍ය ප්‍රමාණයට වඩා කේතය හරහා ගලා ඒමට ඔබට අවශ්‍ය නැති බැවිනි. නිදසුනක් ලෙස, කිසියම් ශ්‍රිත පරාමිතියක් ධනාත්මක නිඛිලයක් වනු ඇතැයි ඔබ අපේක්ෂා කරන්නේ නම්, එම විචල්‍යය කේත තොගයේ වෙනත් තැනක භාවිතා වන තෙක් බලා සිටීම වෙනුවට ශ්‍රිත ඇමතුම ලබා දෙන මොහොතේදී එම සීමාව ක්‍රියාත්මක කළ යුතුය.

ප්‍රමාද වී ඇල්ලීම මට මගේම නීති රීති ඇති බැවින් එය ගැන අදහස් දැක්විය නොහැක. මම කිරීමට උත්සාහ කරන එක් දෙයක් නම් ව්‍යතිරේකයන් කණ්ඩායම් දෙකකට වෙන් කිරීමයි. එකක් අභ්‍යන්තර භාවිතය සඳහා පමණක් වන අතර අනෙක බාහිර භාවිතය සඳහා පමණි. අභ්‍යන්තර ව්‍යතිරේකය මගේ කේතයෙන් හසු වී හසුරුවනු ලබන අතර බාහිර ව්‍යතිරේකය යනු මා අමතන ඕනෑම කේතයකින් හැසිරවිය යුතුය. මෙය මූලික වශයෙන් පසුකාලීනව දේවල් අල්ලා ගැනීමේ ආකාරයකි, නමුත් එය අභ්‍යන්තර කේතයේ අවශ්‍ය විටෙක රීතියෙන් බැහැර වීමට නම්යශීලී බවක් ලබා දෙන බැවිනි.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.