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.