Tauri构建的录屏程序读取JSON文件时无报错意外退出
Tauri构建后读取本地JSON文件导致程序崩溃的解决方法
问题根源
- 相对路径失效:开发环境中程序运行在项目根目录,
./Data/ffmpeg_variables.json能正确定位文件;但构建为exe后,程序工作目录变为exe所在路径,且未将Data文件夹正确打包到资源目录,导致文件找不到。 - 未处理错误直接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
相关产品推荐
相关产品推荐

