--- /dev/null
+/*
+ * Copyright 2016 Facebook, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <folly/ExceptionWrapper.h>
+
+#include <exception>
+#include <iostream>
+
+namespace folly {
+
+[[noreturn]] void exception_wrapper::throwException() const {
+ if (throwfn_) {
+ throwfn_(item_.get());
+ } else if (eptr_) {
+ std::rethrow_exception(eptr_);
+ }
+ std::cerr
+ << "Cannot use `throwException` with an empty folly::exception_wrapper"
+ << std::endl;
+ std::terminate();
+}
+
+fbstring exception_wrapper::class_name() const {
+ if (item_) {
+ auto& i = *item_;
+ return demangle(typeid(i));
+ } else if (eptr_) {
+ return ename_;
+ } else {
+ return fbstring();
+ }
+}
+
+fbstring exception_wrapper::what() const {
+ if (item_) {
+ return exceptionStr(*item_);
+ } else if (eptr_) {
+ return estr_;
+ } else {
+ return fbstring();
+ }
+}
+
+fbstring exceptionStr(const exception_wrapper& ew) {
+ return ew.what();
+}
+
+} // folly
#pragma once
-#include <cassert>
#include <exception>
-#include <iostream>
#include <memory>
+#include <string>
+#include <type_traits>
+#include <utility>
+
#include <folly/ExceptionString.h>
+#include <folly/FBString.h>
#include <folly/detail/ExceptionWrapper.h>
namespace folly {
// If the exception_wrapper does not contain an exception, std::terminate()
// is invoked to assure the [[noreturn]] behaviour.
- [[noreturn]] void throwException() const {
- if (throwfn_) {
- throwfn_(item_.get());
- } else if (eptr_) {
- std::rethrow_exception(eptr_);
- }
- std::cerr
- << "Cannot use `throwException` with an empty folly::exception_wrapper"
- << std::endl;
- std::terminate();
- }
+ [[noreturn]] void throwException() const;
explicit operator bool() const {
return item_ || eptr_;
std::exception* getCopied() { return item_.get(); }
const std::exception* getCopied() const { return item_.get(); }
- fbstring what() const {
- if (item_) {
- return exceptionStr(*item_);
- } else if (eptr_) {
- return estr_;
- } else {
- return fbstring();
- }
- }
-
- fbstring class_name() const {
- if (item_) {
- auto& i = *item_;
- return demangle(typeid(i));
- } else if (eptr_) {
- return ename_;
- } else {
- return fbstring();
- }
- }
+ fbstring what() const;
+ fbstring class_name() const;
template <class Ex>
bool is_compatible_with() const {
}
// For consistency with exceptionStr() functions in String.h
-inline fbstring exceptionStr(const exception_wrapper& ew) {
- return ew.what();
-}
+fbstring exceptionStr(const exception_wrapper& ew);
/*
* try_and_catch is a simple replacement for try {} catch(){} that allows you to
fn();
}
};
-}
+
+} // folly