Ali Shobeyri
Ali Shobeyri
خواندن ۲ دقیقه·۵ سال پیش

تشخیص Exception ها در Coroutines

هر زمانی به هر دلیل امکان وقوع Exceptionدر کد شما وجود داره ، اما در Coroutines چطوری باید این موضوع رو هندل کنیم ؟

قبل از خواندن این مقاله این سه مقاله رو بخونید :

  1. پیاده سازی Coroutines در Android و Kotlin (مقدماتی و ساده)
  2. معماری Coroutines در Android و Kotlin (نگاه جزئی تر)
  3. عملیات Join و Cancel و Yield در 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 شما کرش می‌کنه و ادامه کدها رو اجرا نمی‌کنه :

عبارت I'm Here به دلیل کرش کردن Coroutine اجرا نشده
عبارت I'm Here به دلیل کرش کردن Coroutine اجرا نشده



کاتلیناندرویداندروید استدیوkotlincoroutines
برنامه نویس اندروید - https://www.linkedin.com/in/iryebohs/
شاید از این پست‌ها خوشتان بیاید