exception - 如何从调用堆栈中的多个层返回?

标签 exception rust exit

假设我们有一个游戏循环,遵循此Python伪代码的思路

def handle_events():
    for e in get_frame_events():
        if e.type == CloseEvent:
            raise SuccessfulExit()

def gameloop():
    while True:
        handle_events()
        handle_physics()
        render()

def main():
    try: gameloop()
    except SuccessfulExit: return

我们可以从handle_events退出程序,同时展开堆栈并调用所有析构函数。如果对handle_events的调用堆栈更深,则返回一个 bool 值表示程序是否应一直退出直到main,这是不切实际的。

我知道process::exit,但是它很苛刻,不调用析构函数,而是立即退出。是否可以在Rust上面的代码中执行类似的操作?

最佳答案

返回错误并在主函数中与错误匹配:

#[derive(Debug)]
enum Error {
    SuccessfulExit,
}

fn handle_events() -> Result<(), Error> {
    // for e in get_frame_events() {
        // if e.kind == CloseEvent {
            return Err(Error::SuccessfulExit);
        // }
    // }

    // Ok(())
}

fn gameloop() -> Result<(), Error> {
    loop {
        handle_events()?;
        // handle_physics();
        // render();
    }
}

fn main() {
    match gameloop() {
        Ok(()) | Err(Error::SuccessfulExit) => return,
        Err(e) => eprintln!("Error: {:?}", e),
    }
}

从技术上讲,您还可能引起 panic ,然后 catch 它,但这是一个糟糕的主意。

关于exception - 如何从调用堆栈中的多个层返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59645711/

相关文章:

java - 在可运行的 jar 中找不到 getTimeStamp(),但在其他地方找到

gtk - 使用 GTK+,如何在创建 Box 后为其添加标签?

c - 用c语言编写正确的软件

haskell - Haskell 中是否有任何终止折叠?

Java MouseListener 输入和退出不会更新,除非我使用 Alt Tab

java - 异常:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:握手错误

java - 为什么 resources.getStringArray(int) 会抛出异常?

exception - 在具有 3 个字段的 Cassandra 表中插入行作为复合键

rust - 在比赛语句和结果中可变借用

rust - 是否可以让 Cargo 从私有(private)远程 git 获取依赖项?