Rust 从文件反序列化toml时出现无效错误

Rust 从文件反序列化toml时出现无效错误,rust,deserialization,Rust,Deserialization,涉及的板条箱: toml=“0.5.6” serde={version=“1.0”,features=[“派生”]} 我试图反序列化通过将toml::to_string()的输出保存到磁盘而生成的toml数据。 代码可以编译,但在运行时会出现毫无帮助的错误 我正在调用init_cfg(),并使用一个看似有效的测试文件路径来生成我的应用程序配置 文件结构: C:. ├───.vscode ├───res │ ├───cfg #cfg.toml here │ ├───fo

涉及的板条箱: toml=“0.5.6” serde={version=“1.0”,features=[“派生”]}

我试图反序列化通过将toml::to_string()的输出保存到磁盘而生成的toml数据。 代码可以编译,但在运行时会出现毫无帮助的错误

我正在调用init_cfg(),并使用一个看似有效的测试文件路径来生成我的应用程序配置


文件结构:

C:.
├───.vscode
├───res
│   ├───cfg
         #cfg.toml here
│   ├───fonts
│   │   └───FiraCode-5.2
│   ├───layout
│   ├───splits
│   └───sys
├───src

cfg.toml:

title = "title"
width = 400
height = 600

代码

#[派生(调试、序列化、反序列化)]
发布结构{
酒吧名称:字符串,
酒吧宽度:u32,
酒吧高度:u32,
}
pub fn init\u cfg(cfg\u路径:&path)->Box{
让mut config=Cfg::default();
//检查配置是否存在
如果cfg_path.exists(){
//加载配置
config=*Self::read(cfg_路径);
//返回堆分配的Cfg实例
返回框::新建(配置);
}否则{
//将配置写入磁盘
匹配Self::write(cfg\u路径和配置){
//返回配置
Ok(_count)=>Box::new(配置),
错误(e)=>{
println!(“未能写入默认配置”);
恐慌!(e)
},
}
}
}
pub fn read(路径:&path)->框{
//打开文件
如果path.exists()存在{
让mut file=匹配文件::打开(路径){
确定(文件)=>文件,
错误(Err)=>{
println!(“无法打开配置文件进行读取。”);
恐慌!(呃)
}
};
//将文件读入缓冲区
让mut buffer=Vec::new();
匹配文件。读取(&mut*缓冲区){
Ok(_size)=>{},
错误(Err)=>{
打印!(“无法将cfg文件读入缓冲区”);
恐慌!(呃)
}
};
//反序列化
Box::new(匹配toml::from_slice(&buffer){
Ok(配置)=>配置,
错误(Err)=>
println!(“未能反序列化用户配置”);
//第81行
恐慌!(呃)
}
})
}否则{
惊慌失措!(“给定路径上没有cofig文件。”)
}
}

法院:

运行`target\debug\picosplit.exe`
未能反序列化用户配置。
线程“main”在“Box”处惊慌失措,src\cfg.rs:81:21
堆栈回溯:
0:backtrace::backtrace::dbghelp::trace
在C:\Users\VssAdministrator\.cargo\registry\src\github.com-1ecc6299db9ec823\backtrace-0.3.46\src\backtrace/dbghelp.>rs:88
1:backtrace::backtrace::trace\u未同步
位于C:\Users\VssAdministrator\.cargo\registry\src\github.com-1ecc6299db9ec823\backtrace-0.3.46\src\backtrace/mod.rs:66
2:std::sys\u common::backtrace::\u print\u fmt
在src\libstd\sys\u common/backtrace.rs:78
3:::fmt
在src\libstd\sys\u common/backtrace.rs:59
4:core::fmt::write
在src\libcore\fmt/mod.rs:1076
5:std::io::Write::Write\u fmt
在src\libstd\io/mod.rs:1537
6:std::sys_common::backtrace::\u打印
在src\libstd\sys\u common/backtrace.rs:62
7:std::sys_common::backtrace::print
在src\libstd\sys\u common/backtrace.rs:49
8:std::panicking::default_hook::{{closure}
在src\libstd/panicking.rs:198
9:std::panicking::default\u hook
在src\libstd/panicking.rs:217
10:std::恐慌::生锈\u恐慌\u带钩
在src\libstd/panicking.rs:526
11:std::恐慌::开始恐慌
在C:\Users\lmpri\scoop\persist\rustup\.rustup\toolschains\nightly-x86\u 64-pc-windows-gnu\lib/rustlib/src/>rust\src\libstd/panicking.rs:456
12:picosplit::cfg::cfg::read
在src/cfg.rs:81
13:picosplit::cfg::cfg::init_cfg
在src/cfg.rs:36
14:picosplit::main
在src/main.rs:18
15:std::rt::lang_start:{{closure}
在C:\Users\lmpri\scoop\persist\rustup\.rustup\toolschains\nightly-x86\u 64-pc-windows-gnu\lib/rustlib/src/>rust\src\libstd/rt.rs:67
16:std::rt::lang_start_internal:{{closure}
在src\libstd/rt.rs:52
17:std::恐慌::尝试::打电话
在src\libstd/panicking.rs:348
18:std::恐慌::尝试
在src\libstd/panicking.rs:325
19:std::恐慌::抓捕\放松
在src\libstd/panic.rs:394
20:std::rt::lang\u start\u内部
在src\libstd/rt.rs:51
21:std::rt::lang_开始
在C:\Users\lmpri\scoop\persist\rustup\.rustup\toolschains\nightly-x86\u 64-pc-windows-gnu\lib/rustlib/src/rust\src\libstd/rt.rs:67
22:main
23:u_utmaincart启动
位于D:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:339
24:MainCRT启动
位于D:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:223
25:单位搜索
26:单位搜索
代码可以编译,但在运行时会出现毫无帮助的错误

这是因为您将一个任意错误类型推到了其中,这将为您提供一个如文档所示的框:

每个线程的panic都可以作为Box类型和panic的单参数形式获得!宏将是传输的值

相反,你可以:

  • 使用“展开”,它将调试打印错误,并生成一些内容
  • 使用了多参数形式的
    panic其工作原理类似于
    println并允许调试打印:
  • 不使用恐慌是我通常建议的,但它除了“不起作用”之外真的没有什么用处
由于您没有提供可运行的复制案例,因此无法进一步提供帮助

一旦你得到了一条有用的错误信息,你可能想看看项目本身的错误
Running `target\debug\picosplit.exe`
Failed to deserialize user config.
 thread 'main' panicked at 'Box<Any>', src\cfg.rs:81:21
 stack backtrace:
    0: backtrace::backtrace::dbghelp::trace
              at C:\Users\VssAdministrator\.cargo\registry\src\github.com-1ecc6299db9ec823\backtrace-0.3.46\src\backtrace/dbghelp.> rs:88      
    1: backtrace::backtrace::trace_unsynchronized
              at C:\Users\VssAdministrator\.cargo\registry\src\github.com-1ecc6299db9ec823\backtrace-0.3.46\src\backtrace/mod.rs:66
    2: std::sys_common::backtrace::_print_fmt
              at src\libstd\sys_common/backtrace.rs:78
    3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
              at src\libstd\sys_common/backtrace.rs:59
    4: core::fmt::write
              at src\libcore\fmt/mod.rs:1076
    5: std::io::Write::write_fmt
              at src\libstd\io/mod.rs:1537
    6: std::sys_common::backtrace::_print
              at src\libstd\sys_common/backtrace.rs:62
    7: std::sys_common::backtrace::print
              at src\libstd\sys_common/backtrace.rs:49
    8: std::panicking::default_hook::{{closure}}
              at src\libstd/panicking.rs:198
    9: std::panicking::default_hook
              at src\libstd/panicking.rs:217
   10: std::panicking::rust_panic_with_hook
              at src\libstd/panicking.rs:526
   11: std::panicking::begin_panic
              at C:\Users\lmpri\scoop\persist\rustup\.rustup\toolchains\nightly-x86_64-pc-windows-gnu\lib/rustlib/src/> rust\src\libstd/panicking.rs:456
   12: picosplit::cfg::Cfg::read
              at src/cfg.rs:81
   13: picosplit::cfg::Cfg::init_cfg
              at src/cfg.rs:36
   14: picosplit::main
              at src/main.rs:18
   15: std::rt::lang_start::{{closure}}
              at C:\Users\lmpri\scoop\persist\rustup\.rustup\toolchains\nightly-x86_64-pc-windows-gnu\lib/rustlib/src/> rust\src\libstd/rt.rs:67
   16: std::rt::lang_start_internal::{{closure}}
              at src\libstd/rt.rs:52
   17: std::panicking::try::do_call
              at src\libstd/panicking.rs:348
   18: std::panicking::try
              at src\libstd/panicking.rs:325
   19: std::panic::catch_unwind
              at src\libstd/panic.rs:394
   20: std::rt::lang_start_internal
              at src\libstd/rt.rs:51
   21: std::rt::lang_start
              at C:\Users\lmpri\scoop\persist\rustup\.rustup\toolchains\nightly-x86_64-pc-windows-gnu\lib/rustlib/src/rust\src\libstd/rt.rs:67
   22: main
   23: __tmainCRTStartup
              at D:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:339
   24: mainCRTStartup
              at D:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:223
   25: units_search
   26: units_search