Я тестирую функции отлова паники в Rust. У меня есть следующая программа:
use std::panic;
fn create_greeting(name: &str) -> String {
//panic!("Oh no, something went wrong!");
let greeting = format!("Hello, {}!", name);
return greeting;
}
fn main() {
let mut msg: String;
let result = panic::catch_unwind(|| {
let name = "Alice";
msg = create_greeting(name);
});
match result {
Ok(_) => {
println!("{}", msg);
}
Err(_) => {
println!("A panic occurred and was caught");
}
}
}
Идея состоит в том, чтобы вызвать функцию (create_greeting
), которая в некоторых обстоятельствах может привести к панике (я имитирую раскомментирование оператора panic!
, когда захочу). Если все идет нормально, программа печатает результат работы функции, если что-то идет не так, то сообщает пользователю сообщение об ошибке.
Однако при компиляции программы я столкнулся со следующей ошибкой:
error[E0277]: the type `&mut String` may not be safely transferred across an unwind boundary
--> src/main.rs:11:38
|
11 | let result = panic::catch_unwind(|| {
| ------------------- ^-
| | |
| __________________|___________________within this `{closure@src/main.rs:11:38: 11:40}`
| | |
| | required by a bound introduced by this call
12 | | let name = "Alice";
13 | | msg= create_greeting(name);
14 | | });
| |_____^ `&mut String` may not be safely transferred across an unwind boundary
Как это можно решить, пожалуйста?
Вам не нужно передавать изменяемую ссылку через границу размотки. То, что вы, по-видимому, хотите сделать, это:
use std::panic;
fn create_greeting(name: &str) -> String {
//panic!("Oh no, something went wrong!");
format!("Hello, {name}!")
}
fn main() {
let result = panic::catch_unwind(|| create_greeting("Alice"));
match result {
Ok(msg) => {
println!("{msg}");
}
Err(_) => {
println!("A panic occurred and was caught");
}
}
}
Они точно могут, просто им нужна небольшая корректировка.