mirror of
https://github.com/zebrajr/pytorch.git
synced 2025-12-07 12:21:27 +01:00
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
54 lines
1.3 KiB
C++
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
|