You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tauri构建的录屏程序读取JSON文件时无报错意外退出

Tauri构建后读取本地JSON文件导致程序崩溃的解决方法

问题根源

  1. 相对路径失效:开发环境中程序运行在项目根目录,./Data/ffmpeg_variables.json能正确定位文件;但构建为exe后,程序工作目录变为exe所在路径,且未将Data文件夹正确打包到资源目录,导致文件找不到。
  2. 未处理错误直接panic:代码中大量使用unwrap(),一旦文件读取或JSON解析失败,会直接触发panic,导致程序无提示退出。

解决方案

1. 配置资源打包,确保Data文件夹被包含

修改tauri.conf.json的build配置,将Data文件夹添加到资源列表,让Tauri构建时自动打包该目录:

{
  "build": {
    "resources": ["./Data/**"]
  }
}

2. 使用Tauri资源目录获取正确路径

在Rust命令中,放弃相对路径,改用Tauri提供的resource_dir()方法获取程序资源目录,再拼接JSON文件路径,同时替换unwrap()为错误处理逻辑,避免panic:

#[tauri::command]
fn return_framerate_data() -> Result<i32, String> {
    // 获取资源目录并处理错误
    let resource_dir = tauri::api::path::resource_dir()
        .map_err(|e| format!("获取资源目录失败:{}", e))?;
    // 拼接JSON文件的绝对路径
    let json_path = resource_dir.join("Data").join("ffmpeg_variables.json");
    
    // 读取文件并处理错误
    let variable_list_str = std::fs::read_to_string(json_path)
        .map_err(|e| format!("读取JSON文件失败:{}", e))?;
    // 解析JSON并处理错误
    let variable_list: FfmpegVariables = serde_json::from_str(&variable_list_str)
        .map_err(|e| format!("解析JSON失败:{}", e))?;
    
    Ok(variable_list.framerate)
}

所有类似的Tauri命令都需要按此方式修改,统一返回Result类型替代直接panic。

3. 前端添加错误捕获

在read_data_to_html函数中加入try/catch,捕获Rust命令返回的错误,避免程序崩溃并给出友好提示:

async function read_data_to_html() {
  try {
    document.querySelector("#screenshot_saving_dir_data_id").value = await invoke("return_screenshot_output_dir_data");
    document.querySelector("#video_output_dir_data_id").value =  await invoke("return_video_output_dir_data");
    document.querySelector("#video_caching_dir_data_id").value =  await invoke("return_stream_cache_dir_data");
    document.querySelector("#action_replay_data_id").value =await  invoke("return_action_replay_dur_data");
    document.querySelector("#streaming_url_data_id").value = await invoke("return_stream_port_data");
    document.querySelector("#unique_file_name_data_id").value = await invoke("return_unique_file_name_data");
    document.querySelector("#x_offset_data_id").value = await invoke("return_x_offset_data");
    document.querySelector("#y_offest_data_id").value = await invoke("return_y_offset_data");
    document.querySelector("#region_size_x_data_id").value = await invoke("return_video_size_x_data");
    document.querySelector("#region_size_y_data_id").value = await invoke("return_video_size_y_data");
    document.querySelector("#show_region_data_id").checked = await  invoke("return_show_region_data");
    document.querySelector("#framerate_data_id").value =await invoke("return_framerate_data");
    document.querySelector("#microphone_audio_input_id").value = await invoke("return_micropohne_device_data");
    document.querySelector("#desktop_audio_input_id").value =  await invoke("return_desktop_device_data");
  } catch (error) {
    console.error("加载设置失败:", error);
    alert(`加载设置失败:${error}`);
  }
}

内容的提问来源于stack exchange,提问作者Mypantsrtooobig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:27:52