Codeit Mobile
94 subscribers
3 photos
1 video
243 links
📱 آموزش برنامه‌نویسی موبایل

Kotlin • Android

🚀 آموزش ساده، کاربردی و پروژه‌محور
💡 مخصوص توسعه‌دهندگان موبایل
Download Telegram
🎯 مدیریت خطا توی کاتلین فقط try-catch نیست!

خیلیا فکر میکنن exception handling یعنی یه بلاک try بذارن و توش catch کنن. اما تو کاتلین راه‌های بهتری هم هست که کد رو خواناتر و امن‌تر می‌کنه.

🌀 با Result type می‌تونی خطا رو مثل یه مقدار برگردونی، نه اینکه throw کنی. اینطوری caller مجبور نیست همیشه منتظر unexpected exception باشه.

مثال واقعی: فرض کن داری یه API call می‌کنی. نتیجه رو به جای اینکه throw کنی، با Result برمی‌گردونی تا هر کس هر جور خواست هندل کنه.

sealed class ApiResult<out T> {
data class Success<T>(val data: T) : ApiResult<T>()
data class Error(val message: String, val code: Int) : ApiResult<Nothing>()
}

suspend fun fetchUser(id: String): ApiResult<User> {
return try {
val user = apiService.getUser(id)
ApiResult.Success(user)
} catch (e: Exception) {
ApiResult.Error(e.message ?: "Unknown error", 500)
}
}


🧠 اینجا دیگه caller می‌تونه با when expression هر دو حالت رو مدیریت کنه بدون نیاز به try-catch توی UI.

📌 نکته: برای خطاهای قابل پیش‌بینی بهتره از Result یا sealed class استفاده کنی، برای خطاهای غیرمنتظره (مثل NullPointer) باز هم try-catch لازمه.

بهترین تمرین: exception handling رو به لایه‌های پایین (مثل repository) ببر و توی UI فقط State مربوطه رو نشون بده.

#ExceptionHandling #Kotlin #SealedClass #ResultPattern #AndroidDev #Codeit #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🎯 الگوی «Result» در «Kotlin» یکی از تمیزترین روش‌های مدیریت خطاست
بدون نیاز به try-catch‌های زنجیره‌ای و گیج‌کننده 🔁

🔥 چرا «Result Pattern»؟
- موفقیت یا شکست رو به‌صورت صریح برمی‌گردونه
- کد خواناتر و قابل پیش‌بینی‌تر می‌شه
- ترکیب‌پذیری با «sealed class» و «when» بی‌نظیره

📱 مثال واقعی: گرفتن اطلاعات کاربر از سرور با «Retrofit»

sealed class NetworkResult<out T> {
data class Success<T>(val data: T) : NetworkResult<T>()
data class Error(val message: String, val exception: Throwable? = null) : NetworkResult<Nothing>()
}

suspend fun fetchUser(): NetworkResult<User> {
return try {
val user = api.getUser() // فراخوانی شبکه
NetworkResult.Success(user)
} catch (e: Exception) {
NetworkResult.Error("خطا در دریافت داده", e)
}
}

// استفاده
when (val result = fetchUser()) {
is NetworkResult.Success -> showUser(result.data)
is NetworkResult.Error -> showError(result.message)
}


🧠 این کد چه می‌کند؟
- یک «sealed class» به نام «NetworkResult» تعریف می‌کند
- در صورت موفقیت شیء «Success» و در صورت خطا شیء «Error» برمی‌گرداند
- با «when» هر حالت رو جداگانه مدیریت می‌کنیم؛ هیچ خطایی از قلم نمی‌افته

💡 نکته عملی:
این الگو با «Coroutines» و «Flow» هم عالی کار می‌کنه
برای مدیریت خطاهای محلی و سراسری در «ViewModel» می‌تونی ازش استفاده کنی

📌 خلاصه: «Result Pattern» = کد مقاوم‌تر + اشکال‌زدایی آسان‌تر

#Codeit #Android #Kotlin #Jetpack #ResultPattern #CleanArchitecture #SealedClass #ErrorHandling
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1