pytorch/c10/util/ScopeExit.h
Dhruv Matani d728491fc1 [RFC] [PyTorch Edge] Simplify error logging in mobile/import.cpp (#55711)
Summary:
Pull Request resolved: https://github.com/pytorch/pytorch/pull/55711

Currently, there is some complex logic that tries to handle all exceptions but re-throws them as a `c10::Error` so that it can log the error message. I'm looking for context on why this was added. The current logic (after talking with swolchok) seems equivalent, simpler, and also preserves the original stack trace from where the exception was originally thrown. This is useful when viewing the backtrace in logview. Re-throwing an exception using `TORCH_CHECK(false, message)` results in the original exception stack trace getting lost, so we want to avoid that.
ghstack-source-id: 128043281

Test Plan: Build.

Reviewed By: iseeyuan

Differential Revision: D27688352

fbshipit-source-id: b7b1a29b652b31da80d72f16d284e48b8623377b
2021-05-04 20:45:32 -07:00

54 lines
1.3 KiB
C++

#pragma once
#include <type_traits>
#include <utility>
namespace c10 {
/**
* Mostly copied from https://llvm.org/doxygen/ScopeExit_8h_source.html
*/
template <typename Callable>
class scope_exit {
Callable ExitFunction;
bool Engaged = true; // False once moved-from or release()d.
public:
template <typename Fp>
// constructor accepting a forwarding reference can hide the
// move constructor
// @lint-ignore CLANGTIDY
explicit scope_exit(Fp&& F) : ExitFunction(std::forward<Fp>(F)) {}
scope_exit(scope_exit&& Rhs) noexcept
: ExitFunction(std::move(Rhs.ExitFunction)), Engaged(Rhs.Engaged) {
Rhs.release();
}
scope_exit(const scope_exit&) = delete;
scope_exit& operator=(scope_exit&&) = delete;
scope_exit& operator=(const scope_exit&) = delete;
void release() {
Engaged = false;
}
~scope_exit() {
if (Engaged) {
ExitFunction();
}
}
};
// Keeps the callable object that is passed in, and execute it at the
// destruction of the returned object (usually at the scope exit where the
// returned object is kept).
//
// Interface is specified by p0052r2.
template <typename Callable>
scope_exit<typename std::decay<Callable>::type> make_scope_exit(Callable&& F) {
return scope_exit<typename std::decay<Callable>::type>(
std::forward<Callable>(F));
}
} // namespace c10