use std::io::{stderr, Write};
use std::thread::panicking;
use std::process::abort;
pub struct PanicGuard {
message: Option<&'static str>
}
impl PanicGuard {
pub fn new() -> PanicGuard { PanicGuard{message: None} }
pub fn with_message(message: &'static str) -> PanicGuard {
PanicGuard{message: Some(message)}
}
}
impl Drop for PanicGuard {
fn drop(&mut self) {
if panicking() {
let msg = self.message.unwrap_or("cannot unwind past stack frame");
let _ = writeln!(&mut stderr(), "{} at {}:{}",
msg, file!(), line!());
abort();
}
}
}
#[macro_export]
macro_rules! abort_on_panic {
($message:expr, $body:block) => {
{
let guard = ::abort_on_panic::PanicGuard::with_message($message);
let result = $body;
drop(guard);
result
}
};
($body:block) => {
{
let guard = ::abort_on_panic::PanicGuard::new();
let result = $body;
drop(guard);
result
}
};
}