Обработка исключений в проекте Compose Multiplatform на платформе Kotlin/Wasm

Проблема

Здравствуйте! Я пытаюсь создать диалоговое окно, которой будет появляться, когда выбрасывается исключение из кода Kotlin/Wasm. Пример исключения:

Button(
    onClick = {
        throw DebugException("Exception for debugging :)")
    }
) {
    Text(text = "Throw an exception (developers only)")
}
class DebugException(message: String) : Exception(message)
DebugException: Exception for debugging :)
kotlinx.coroutines.error_$external_fun  @   composeApp.uninstantiated.mjs:187
$kotlinx.coroutines.error_$external_fun__externalAdapter    @   b31441b….wasm:0x45636a
$kotlinx.coroutines.internal.propagateExceptionFinalResort  @   b31441b….wasm:0x456c38
$kotlinx.coroutines.internal.handleUncaughtCoroutineException   @   b31441b….wasm:0x44a498
$kotlinx.coroutines.handleCoroutineException    @   b31441b….wasm:0x4292b3
$kotlinx.coroutines.StandaloneCoroutine.handleJobException  @   b31441b….wasm:0x425835
$kotlinx.coroutines.JobSupport.finalizeFinishingState   @   b31441b….wasm:0x42c8be
$kotlinx.coroutines.JobSupport.tryMakeCompletingSlowPath    @   b31441b….wasm:0x42edf6
$kotlinx.coroutines.JobSupport.tryMakeCompleting    @   b31441b….wasm:0x42ebc1
$kotlinx.coroutines.JobSupport.makeCompletingOnce   @   b31441b….wasm:0x42ea7b
$kotlinx.coroutines.AbstractCoroutine.resumeWith    @   b31441b….wasm:0x425306
$kotlin.coroutines.CoroutineImpl.resumeWith @   b31441b….wasm:0x3ac570
$kotlinx.coroutines.DispatchedTask.run  @   b31441b….wasm:0x44bd26
$androidx.compose.ui.platform.FlushCoroutineDispatcher$flush$lambda.invoke  @   b31441b….wasm:0x62cd17
$androidx.compose.ui.platform.FlushCoroutineDispatcher$flush$lambda.invoke  @   b31441b….wasm:0x62cd43
$androidx.compose.ui.platform.FlushCoroutineDispatcher.performRun   @   b31441b….wasm:0x62d402
$androidx.compose.ui.platform.FlushCoroutineDispatcher.flush    @   b31441b….wasm:0x62d399
$androidx.compose.ui.scene.ComposeSceneRecomposer.performScheduledEffects   @   b31441b….wasm:0x63b830
$androidx.compose.ui.scene.BaseComposeScene.sendPointerEvent    @   b31441b….wasm:0x633db0
$androidx.compose.ui.scene.ComposeScene.sendPointerEvent$default    @   b31441b….wasm:0x638995
$androidx.compose.ui.window.ComposeWindow.onMouseEvent  @   b31441b….wasm:0x64705d
$androidx.compose.ui.window.ComposeWindow$initEvents$lambda.invoke  @   b31441b….wasm:0x645900
$androidx.compose.ui.window.ComposeWindow$initEvents$lambda.invoke  @   b31441b….wasm:0x645926
$androidx.compose.ui.window.ComposeWindow$addTypedEvent$lambda.invoke   @   b31441b….wasm:0x645545
$androidx.compose.ui.window.ComposeWindow$addTypedEvent$lambda.invoke   @   b31441b….wasm:0x64556f
$org.w3c.dom.encryptedmedia.__callFunction_((Js)->Unit) @   b31441b….wasm:0x45a223
eval @ composeApp.uninstantiated.mjs

Я пробовал:

  • Использовать событие error:

    onerror = (e) => { 
        // код
    }
    
  • Перезаписать функцию console.error:

    const error = console.error
    console.error = (e) => {
        error(e)
        // код
    }
    
  • try-catch в классе Main

    @OptIn(ExperimentalComposeUiApi::class)
    fun main() {
        try {
            ComposeViewport(document.body!!) {
                MainScreen()
            }
        } catch (e: Throwable) {
            e.printStackTrace()
            document.getElementById("err_overlay")!!.apply {
                this as HTMLDivElement
                style.display = "flex";
                classList.add("open");
    
                val errorMessage = document.getElementById("err_code") as HTMLPreElement;
                errorMessage.textContent = e.stackTraceToString();
            }
        }
    }
    

Вопрос

Как правильно обработать исключение, выброшенное из кода Kotlin/Wasm?


Если что-то не так, пожалуйста, поправьте меня.


Ответы (0 шт):