هر زمانی به هر دلیل امکان وقوع Exceptionدر کد شما وجود داره ، اما در Coroutines چطوری باید این موضوع رو هندل کنیم ؟
قبل از خواندن این مقاله این سه مقاله رو بخونید :
از کد مقاله قبلی استفاده میکنیم و Exception رو در اون دخیل میکنیم :
کلاسِ CancellationException مختصِ Exception حاصل از Cancel شدنه ، میتونیم پیغامِ دلخواه رو هم در داخل تابع cancel بهش بدیم :
نکته : عبارت folan?.let یعنی اگر null نبود کد درون بلاک رو اجرا کن
شما میتونید از Exception های دیگه هم استفاده کنید ولی باید حواستون باشه ، مثلا :
نکته : job.cancel کامنت شده اما اگه شما به جای throw از همون job.cancel هم استفاده کنید همین نتیجه رو میگیرید
اما به چه دردی میخوره که برای cancel شدن Exception بذاریم ؟ چون ممکنه از resource هایی استفاده کنیم که نیاز به بسته شدن داشته باشن ، در قسمت catch میتونیم این عملیاتها رو انجام بدیم
یکی از موارد مهم هم در هندل کردن Exception قضیه time out شدنه ، مثال : رکوئستِ وب ! برای این کار به جای launch از یک builder دیگه استفاده میشه به اسم withTimeout و از Exception مخصوص خودش در کنار CancellationException استفاده میکنیم :
نکته : نیازی به اضافه کردن TimeoutCancellationException نیست و میشه از همون قبلی هم استفاده کرد اما ما خوایم تفاوتی بین cancel شدن عادی و cancel شدن به دلیل time out باشه
میتونیم از یک builder دیگه به نام withTimeoutOrNull استفاده کنیم ، این builder وقتی time out بشه job رو null میکنه و در قسمتهای بعدی کد ما با بررسی job == null میتونیم بفهمیم cancel شده یا خیر :
اگه از withTimeoutOrNull استفاده نکنیم و به جاش از همون withTimeout استفاده کنیم و catch رو هم براش ننویسم Coroutine شما کرش میکنه و ادامه کدها رو اجرا نمیکنه :