假设我们有一个游戏循环,遵循此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/