Add basic panic handling

finchie
Dec 11, 2025, 5:51 PM
6AUGQLIKK6WY3ZB3ZQ4PCN6NXRLP65CLF2YMOTDDAP6QQAIGGELQC

Dependencies

  • [2] WFWTKCJN Create initial Visual Studio Code extension
  • [3] 72K45XKD Refactor inline credit to improve hover messages

Change contents

  • replacement in extensions/vscode/src/vscode_sys/macros/object/function/setter.rs at line 30
    [2.70848][2.70848:70885]()
    > + 'static,
    [2.70848]
    [2.70885]
    >
    + std::panic::RefUnwindSafe
    + 'static,
  • edit in extensions/vscode/src/vscode_sys/macros/object/function/setter.rs at line 41
    [2.71418][2.71418:71470]()
    // TODO: error handling
  • edit in extensions/vscode/src/vscode_sys/macros/object/function/setter.rs at line 42
    [2.71561][2.71561:71715]()
    let returned_result =
    function_callback(function_context.env, $($function_argument_name),*)?;
  • replacement in extensions/vscode/src/vscode_sys/macros/object/function/setter.rs at line 43
    [2.71716][2.71716:71796]()
    $function_create_owned_return_type(returned_result)
    [2.71716]
    [2.71796]
    let function_return_value = match std::panic::catch_unwind(|| function_callback(function_context.env, $($function_argument_name),*)) {
    Ok(function_result) => function_result?,
    Err(panic_payload) => {
    tracing::error!(
    message = "Function panic",
    event_handler = $function_js_name,
    ?panic_payload
    );
    return Err(napi::Error::from_reason("Function panic"));
    }
    };
    $function_create_owned_return_type(function_return_value)
  • replacement in extensions/vscode/src/vscode_sys/macros/interface_builder.rs at line 44
    [2.79860][2.79860:79893]()
    > + 'static,
    [2.79860]
    [2.79893]
    >
    + std::panic::RefUnwindSafe
    + 'static,
  • edit in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 15
    [2.84398]
    [2.84398]
    + std::panic::RefUnwindSafe
  • replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 39
    [2.85640][2.85640:85703]()
    message = "Invalid arguments",
    [2.85640]
    [2.85703]
    message = "Invalid arguments provided to event handler",
  • replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 43
    [2.85840][2.85840:85883]()
    return Ok(());
    [2.85840]
    [2.85883]
    return Err(napi::Error::from_reason(
    "Invalid arguments provided to event handler",
    ));
  • replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 50
    [2.85933][2.85933:86271]()
    if let Err(error) = handler(function_context.env, event) {
    tracing::error!(
    message = "Handler exited unsuccessfully",
    event_handler = $function_js_name,
    ?error
    );
    }
    [2.85933]
    [2.86271]
    match std::panic::catch_unwind(|| handler(function_context.env, event)) {
    Ok(handler_result) => match handler_result {
    Ok(result) => Ok(result),
    Err(error) => {
    tracing::error!(
    message = "Event handler returned an error",
    event_handler = $function_js_name,
    ?error
    );
  • replacement in extensions/vscode/src/vscode_sys/macros/event_handler.rs at line 60
    [2.86272][2.86272:86299]()
    Ok(())
    [2.86272]
    [2.86299]
    Err(napi::Error::from_reason("Event handler returned an error"))
    }
    },
    Err(panic_payload) => {
    tracing::error!(
    message = "Event handler panicked",
    event_handler = $function_js_name,
    ?panic_payload
    );
    Err(napi::Error::from_reason("Event handler panicked"))
    }
    }
  • edit in extensions/vscode/src/vscode_sys/log.rs at line 191
    [2.98935]
    [2.98935]
    std::panic::set_hook(Box::new(|panic_hook_info| {
    tracing::error!(message = "Extension panic", %panic_hook_info);
    }));
  • edit in extensions/vscode/src/lib.rs at line 4
    [2.108575][2.108575:108598]()
    // TODO: panic handler
  • edit in extensions/vscode/src/lib.rs at line 157
    [2.113957][2.113957:114010]()
    let mut program_state = ExtensionState::get()?;
  • edit in extensions/vscode/src/lib.rs at line 164
    [2.114263]
    [2.114263]
    let mut program_state = ExtensionState::get()?;
  • edit in extensions/vscode/src/lib.rs at line 221
    [2.116393][2.116393:116441]()
    let program_state = ExtensionState::get()?;
  • edit in extensions/vscode/src/lib.rs at line 222
    [2.116484][2.116484:116485]()
  • edit in extensions/vscode/src/lib.rs at line 230
    [2.116712]
    [3.819]
    let program_state = ExtensionState::get()?;
  • edit in .cargo/config.toml at line 3
    [2.279498]
    # Cranelift doesn't support unwinding, so make sure to use LLVM as the codegen backend
    # TODO: remove this workaround once unwinding is stable on Linux:
    # https://github.com/rust-lang/rustc_codegen_cranelift/issues/1567
    [unstable]
    codegen-backend = true
    [profile.dev]
    codegen-backend = "llvm"