Exceptions in coroutines travel differently than in plain code: a failing child can cancel siblings, and launch uses coroutine exception handlers — async exposes failure through await. The rule of thumb: use try/catch around suspend calls you own; install CoroutineExceptionHandler on the scope for fire-and-forget launch when you cannot wrap the body.
What changes with concurrency