۲۹ - ۸تعامل غیرمنتظره با تهی
در مواقعی که مقدارِ گرفته شده ممکنه تهی باشه، باید مراقب باشین. به خاطرِ نااکیدی، تهی ممکنه قبل یا بعد از هندلرِ استثنا اجبار شده باشه. پس اگه انتظارِ این دوتا رو داشتین، ممکنه جا بخورین:
اینکه هندلرِ استثناتون قرار بوده تهی رو بگیره،
یا اینکه بعد از گرفتنِ مثلاً یه SomeException
، هیچ تهیای باعثِ شکست ِ برنامهتون نمیشده.
برای کنار اومدن با اینها، باید این دو مورد رو به خاطر داشته باشین:
مدیریتِ استثنا اصلاً برای گرفتنِ تهی نیست و نباید برای چنین کاری استفاده بشه.
گرفتنِ یه استثنا، حتی SomeException
، بدونِ انداختنِ مجددِ یه استثنا جلوی شکست ِ برنامه رو نمیگیره.
برای اینکه منظورمون رو بهتر نشون بدیم، هم یه مورد که یه استثنا رو از یه تهی گرفتیم، و هم موردی که یه تهی از زیر دستِ هندلر در میره رو مثال میزنیم:
import Control.Exception
noWhammies :: IO (Either SomeException ())
noWhammies =
try undefined
megaButtums :: IO (Either SomeException ())
megaButtums =
try $ return undefined
فکر میکنین هردوشون یه نتیجه میدن؟ خب...
Prelude> noWhammies
Left Prelude.undefined
Prelude> megaButtums
Right *** Exception: Prelude.undefined
این به خاطرِ نااکیدی ِه. وقتی تهی زیرِ یه return
پوشونده شده، باعث میشه تهی بعد از try
محاسبه بشه، و منجر به یه خطا ِ گرفته نشده توی دادهساز ِ Right
میشه. نتیجهی اخلاقیای که از این مثالها میگیرین، نباید این باشه که "تنبلی بیخوده،" بلکه باید یاد بگیرین "برنامههای مطلقی بنویسین که از تهی استفاده نمیکنن." التبه فقط تهیهای اجبار نشده نیستن که باعثِ شکست خوردنِ برنامههایی میشن که قرار نبوده استثناهای گرفته نشده داشته باشن؛ چیزهای دیگهای هم هستن، مثلِ...