۲۹ - ۸تعامل غیرمنتظره با تهی

در مواقعی که مقدارِ گرفته شده ممکنه تهی باشه، باید مراقب باشین. به خاطرِ نااکیدی، تهی ممکنه قبل یا بعد از هندلرِ استثنا اجبار شده باشه. پس اگه انتظارِ این دوتا رو داشتین، ممکنه جا بخورین:

  • اینکه هندلرِ استثناتون قرار بوده تهی رو بگیره،

  • یا اینکه بعد از گرفتنِ مثلاً یه ‏‎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‎‏ میشه. نتیجه‌ی اخلاقی‌ای که از این مثال‌ها می‌گیرین، نباید این باشه که "تنبلی بی‌خوده،" بلکه باید یاد بگیرین "برنامه‌های مطلقی بنویسین که از تهی استفاده نمی‌کنن." التبه فقط تهی‌های اجبار نشده نیستن که باعثِ شکست خوردنِ برنامه‌هایی میشن که قرار نبوده استثناهای گرفته نشده داشته باشن؛ چیزهای دیگه‌ای هم هستن، مثلِ...