Skip to content
Rust crate for a convenient RAII scope guard.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.



Rust crate for a convenient RAII scope guard that will run a given closure when it goes out of scope, even if the code between panics (assuming unwinding panic).

The defer! macro and guard are no_std compatible (require only core), but the on unwinding / not on uwinding strategies requires linking to std.

Requires Rust 1.20.

Please read the API documentation here

build_status crates

How to use

#[macro_use(defer)] extern crate scopeguard;

use scopeguard::guard;

fn f() {
    defer!(println!("Called at return or panic"));

use std::fs::File;
use std::io::Write;

fn g() {
    let f = File::create("newfile.txt").unwrap();
    let mut file = guard(f, |f| {
        // write file at return or panic
        let _ = f.sync_all();
    // Access the file through the scope guard itself
    file.write_all(b"test me\n").unwrap();

Recent Changes

  • 1.0.0
    • Change the closure type from FnMut(&mut T) to FnOnce(T): Passing the inner value by value instead of a mutable reference is a breaking change, but allows the guard closure to consume it. (by @tormol)
    • Add defer_on_success!{}, guard_on_success() and OnSuccess strategy, which triggers when scope is exited without panic. It's the opposite to OnUnwind / guard_on_unwind() / defer_on_unwind!{}.
    • Add ScopeGuard::into_inner(), which "defuses" the guard and returns the guarded value. (by @tormol)
    • Implement Sync for guards with non-Sync closures.
    • Require Rust 1.20
  • 0.3.3
    • Use #[inline] on a few more functions by @stjepang (#14)
    • Add examples to crate documentation
  • 0.3.2
    • Add crate categories
  • 0.3.1
    • Add defer_on_unwind!, Strategy trait
    • Rename GuardScopeGuard
    • Add ScopeGuard::with_strategy.
    • ScopeGuard now implements Debug.
    • Require Rust 1.11
  • 0.2.0
    • Require Rust 1.6
    • Use no_std unconditionally
    • No other changes
  • 0.1.2
    • Add macro defer!()
You can’t perform that action at this time.