Ошибка «невозможно безопасно передать границу размотки» при использовании catch_unwind в Rust

Я тестирую функции отлова паники в 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

Как это можно решить, пожалуйста?

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не нужно передавать изменяемую ссылку через границу размотки. То, что вы, по-видимому, хотите сделать, это:

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");
        }
    }
}

Они точно могут, просто им нужна небольшая корректировка.

Chayim Friedman 18.04.2024 13:47

Другие вопросы по теме