සංස්කරණය කරන්න: C # 6.0 වන විට, ව්යතිරේක පෙරහන් දැන් යාමට හොඳ ක්රමයක් බව පවසන අනෙක් අය සමඟ මම එකඟ වෙමි:catch (Exception ex) when (ex is ... || ex is ... )
ඒ හැරෙන්නට මම තවමත් එක්-දිගු සැකැස්මකට වෛර කරන අතර පහත දැක්වෙන ආකාරයට පෞද්ගලිකව කේතය තබමි. මම සිතන්නේ මෙය සෞන්දර්යාත්මක මෙන්ම ක්රියාකාරී වන බැවින් එය අවබෝධය වැඩි දියුණු කරන බවයි. සමහරු එකඟ නොවිය හැකිය:
catch (Exception ex) when (
ex is ...
|| ex is ...
|| ex is ...
)
මුල්:
මම දන්නවා මම මෙතන සාදයට ටිකක් පරක්කුයි, නමුත් ශුද්ධ දුම ...
හඹා යෑමට කෙලින්ම කැපීම, මේ ආකාරයේ පෙර පිළිතුරක් අනුපිටපත් කරයි, නමුත් ඔබට සැබවින්ම ව්යතිරේක වර්ග කිහිපයක් සඳහා පොදු ක්රියාවක් කිරීමට අවශ්ය නම් සහ එක් ක්රමයක විෂය පථය තුළ සියල්ලම පිළිවෙලට හා පිළිවෙලට තබා ගැනීමට අවශ්ය නම්, ලැම්බඩා පමණක් භාවිතා නොකරන්නේ ඇයි? / වසා දැමීම / පේළිගත කිරීමේ ක්රියාවලිය පහත සඳහන් දේ වැනි දෙයක් කිරීමට? මම කිව්වේ, ඔබට එම වසා දැමීම වෙනම ක්රමයක් බවට පත්කිරීමට අවශ්ය බව ඔබට වැටහී යාමේ අවස්ථා ඉතා හොඳයි. නමුත් එවිට අනෙක් කේතය ව්යුහාත්මකව වෙනස් නොකර එය කිරීම පහසුය. හරිද?
private void TestMethod ()
{
Action<Exception> errorHandler = ( ex ) => {
// write to a log, whatever...
};
try
{
// try some stuff
}
catch ( FormatException ex ) { errorHandler ( ex ); }
catch ( OverflowException ex ) { errorHandler ( ex ); }
catch ( ArgumentNullException ex ) { errorHandler ( ex ); }
}
මට පුදුම විය නොහැක ( අනතුරු ඇඟවීම: ටිකක් උත්ප්රාසය / උපහාසය ඉදිරියෙන්) මිහිපිට මේ සියල්ලට මූලික වශයෙන් පහත සඳහන් දේ ප්රතිස්ථාපනය කිරීමට යන්නේ ඇයි:
try
{
// try some stuff
}
catch( FormatException ex ){}
catch( OverflowException ex ){}
catch( ArgumentNullException ex ){}
... මෙම ඊළඟ කේත සුවඳෙහි යම් පිස්සු විචලනයක් සහිතව, මම උදාහරණයක් ලෙස අදහස් කරන්නේ ඔබ යතුරු එබීම් කිහිපයක් ඉතිරි කරන බව මවා පෑමට පමණි.
// sorta sucks, let's be honest...
try
{
// try some stuff
}
catch( Exception ex )
{
if (ex is FormatException ||
ex is OverflowException ||
ex is ArgumentNullException)
{
// write to a log, whatever...
return;
}
throw;
}
මන්ද එය නිසැකවම ස්වයංක්රීයව කියවිය නොහැකි බැවිනි.
/* write to a log, whatever... */ return;
පළමු උදාහරණයෙන් සමාන අවස්ථා තුනක් මම අත්හැරිය බව පිළිගත යුතුය.
නමුත් එය මගේ අදහසකි. කාර්යයන් / ක්රම ගැන ඔබ අසා ඇති නේද? බරපතල ලෙස. පොදු ErrorHandler
ශ්රිතයක් ලියන්න , වැනි, සෑම අල්ලා ගැනීමේ කොටසකින්ම එය අමතන්න.
ඔබ මගෙන් ඇසුවොත්, දෙවන උදාහරණය ( if
සහ is
මූල පද සමඟ) සැලකිය යුතු ලෙස අඩු කියවිය හැකි අතර ඒ සමඟම ඔබේ ව්යාපෘතියේ නඩත්තු අවධියේදී සැලකිය යුතු ලෙස දෝෂ ඇතිවිය හැකිය.
නඩත්තු කිරීමේ අවධිය, ක්රමලේඛයට සාපේක්ෂව අළුත් විය හැකි ඕනෑම අයෙකුට, ඔබේ ව්යාපෘතියේ සමස්ත ජීවිත කාලය තුළ 98.7% හෝ ඊට වැඩි ප්රමාණයක් සමන්විත වනු ඇති අතර, නඩත්තු කටයුතු කරන දුප්පත් ෂම්ක් නිසැකවම ඔබ හැර වෙනත් අයෙකු වනු ඇත. ඔවුන් ඔබේ නමට ශාප කරමින් ඔවුන්ගේ කාලය 50% ක් රැකියාව සඳහා වැය කිරීමට හොඳ අවස්ථාවක් තිබේ.
හා එක් එක් පාඨමාලාව FxCop ඔබ ගස්වල කඳන් හා ඔබට ඇති නිසා ද හරියටම ක්රියාත්මක වැඩසටහන කරන්න zip ඇති බව ඔබගේ කේතය කිරීමට විශ්ලේෂණයක් එකතු කරන්න, සහ රෝගීන් 99.9% ක දී එය මුළුමනින්ම බව ප්රශ්නයක් නොසලකා FxCop කියන්න ඇත්තේ එකම සලකුණු කිරීමේදී නිවැරදි. කණගාටුයි, මම වැරදියට තේරුම් ගත හැකිය, නමුත් එම "නොසලකා හැරීමේ" ගුණාංගය ඇත්ත වශයෙන්ම ඔබේ යෙදුමට සම්පාදනය නොවේද?
සමස්තයක්ම තබයි if
පරීක්ෂණය එක පේළියකට එය වඩාත් කියවිය හැකි ද? මම හිතන්නේ නැහැ. මම අදහස් කළේ, තවත් ක්රමලේඛකයෙකු බොහෝ කලකට පෙර දැඩි ලෙස තර්ක කර ඇත්තේ එක් පේළියක තවත් කේතයක් තැබීමෙන් එය “වේගයෙන් ධාවනය” වනු ඇති බවයි. නමුත් ඇත්ත වශයෙන්ම ඔහු තදින් කෑ ගැසුවේය. ඔහුට පැහැදිලි කිරීමට උත්සාහ කිරීම (face ජු මුහුණකින් - අභියෝගාත්මක විය) පරිවර්තකයා හෝ සම්පාදකයා එම දිගු රේඛාව විවික්ත එක්-උපදෙස්-එක්-පේළි ප්රකාශවලට වෙන් කරන්නේ කෙසේද - ඔහු ඉදිරියට ගොස් ඇත්නම් සහ ප්රති result ලයට සමාන වේ. සම්පාදකයාට වඩා දක්ෂ ලෙස උත්සාහ කිරීම වෙනුවට කේතය කියවිය හැකි ලෙස සකසා ඇත - ඔහුට කිසිදු බලපෑමක් සිදු නොවීය. නමුත් මම කණගාටු වෙමි.
ඔබ දැන් සිට තවත් ව්යතිරේක වර්ග තුනක්, මාසයක් හෝ දෙකක් එකතු කළ විට මෙය කියවිය හැක්කේ කෙතරම් අඩු ද ? (පිළිතුර: එය ලැබෙන ගොඩක් අඩු කියවිය හැකි).
එක් ප්රධාන කරුණක් නම්, අප සෑම දිනකම බලා සිටින පෙළ මූලාශ්ර කේතය සංයුති කිරීමේ බොහෝ කරුණ නම්, කේතය ක්රියාත්මක වන විට සත්ය වශයෙන්ම සිදුවන්නේ කුමක්ද යන්න අනෙක් මිනිසුන්ට සැබවින්ම පැහැදිලිව දැක්වීමයි. සම්පාදකයා ප්රභව කේතය මුළුමනින්ම වෙනස් දෙයක් බවට හරවන අතර ඔබේ කේත හැඩතල ගැන්වීමේ විලාසය ගැන එතරම් තැකීමක් කළ නොහැක. ඒ නිසා සෑම පේළියක්ම මුළුමනින්ම උරා ගනී.
කියමින් ...
// super sucks...
catch( Exception ex )
{
if ( ex is FormatException || ex is OverflowException || ex is ArgumentNullException )
{
// write to a log, whatever...
return;
}
throw;
}