Quick answer: Unity exception inside an async void method disappears without a log? async void exceptions go to SynchronizationContext.UnhandledException — Unity’s default ignores them.
An async UI button handler throws a NullReferenceException; nothing logs and the game continues in a half-broken state.
Don’t async void
Reserve async void for event handlers you don’t await. Even then, wrap the body in try/catch and log explicitly — otherwise exceptions vanish.
Return Awaitable
async Awaitable LoadAsync() {
// throws here propagate to caller
}
async void OnClick() {
try { await LoadAsync(); }
catch (Exception e) { Debug.LogException(e); }
}The async core returns Awaitable; the outer event handler catches and logs.
Global Unobserved Hook
Hook TaskScheduler.UnobservedTaskException for stray Task exceptions. Won’t catch async void but covers fire-and-forget Tasks.
Verifying
Exceptions raised in async paths log to console. UI doesn’t silently break; recovery code (retry, fallback) runs.
“async void swallows exceptions. Wrap with try/catch or return Awaitable.”
Adopt a single AsyncSafe.Run helper that wraps async void event handlers — one place to log, one place to fix when the policy changes.