From 025531e1c5a84c992d2cad3f4876d3a27403c2e0 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Mon, 18 Nov 2013 19:18:03 +0000 Subject: [PATCH] dbms: better [#METR-9194]. --- dbms/include/DB/Core/Exception.h | 5 +++ dbms/include/DB/IO/AsynchronousWriteBuffer.h | 1 + dbms/include/DB/IO/CompressedWriteBuffer.h | 1 + dbms/include/DB/IO/HexWriteBuffer.h | 1 + dbms/include/DB/IO/RemoteWriteBuffer.h | 1 + dbms/include/DB/IO/WriteBufferFromFile.h | 1 + .../DB/IO/WriteBufferFromFileDescriptor.h | 1 + .../DB/IO/WriteBufferFromHTTPServerResponse.h | 1 + dbms/include/DB/IO/WriteBufferFromOStream.h | 1 + .../include/DB/IO/WriteBufferFromPocoSocket.h | 1 + dbms/src/Core/Exception.cpp | 45 +++++++++++++++++++ 11 files changed, 59 insertions(+) diff --git a/dbms/include/DB/Core/Exception.h b/dbms/include/DB/Core/Exception.h index 7a2930a8c75..b746b4f9c0f 100644 --- a/dbms/include/DB/Core/Exception.h +++ b/dbms/include/DB/Core/Exception.h @@ -51,6 +51,11 @@ void throwFromErrno(const std::string & s, int code = 0, int the_errno = errno); */ ExceptionPtr cloneCurrentException(); +/** Попробовать записать исключение в лог (и забыть про него). + * Можно использовать в деструкторах в блоке catch (...). + */ +void tryLogCurrentException(const char * log_name); + void rethrowFirstException(Exceptions & exceptions); diff --git a/dbms/include/DB/IO/AsynchronousWriteBuffer.h b/dbms/include/DB/IO/AsynchronousWriteBuffer.h index 198e9f7d854..e4f9bc643be 100644 --- a/dbms/include/DB/IO/AsynchronousWriteBuffer.h +++ b/dbms/include/DB/IO/AsynchronousWriteBuffer.h @@ -73,6 +73,7 @@ public: } catch (...) { + tryLogCurrentException(__PRETTY_FUNCTION__); } } diff --git a/dbms/include/DB/IO/CompressedWriteBuffer.h b/dbms/include/DB/IO/CompressedWriteBuffer.h index b5534771626..bc91f18aa47 100644 --- a/dbms/include/DB/IO/CompressedWriteBuffer.h +++ b/dbms/include/DB/IO/CompressedWriteBuffer.h @@ -126,6 +126,7 @@ public: } catch (...) { + tryLogCurrentException(__PRETTY_FUNCTION__); } delete qlz_state; diff --git a/dbms/include/DB/IO/HexWriteBuffer.h b/dbms/include/DB/IO/HexWriteBuffer.h index ee3d6bb9314..dd4b98ee918 100644 --- a/dbms/include/DB/IO/HexWriteBuffer.h +++ b/dbms/include/DB/IO/HexWriteBuffer.h @@ -43,6 +43,7 @@ public: } catch (...) { + tryLogCurrentException(__PRETTY_FUNCTION__); } } }; diff --git a/dbms/include/DB/IO/RemoteWriteBuffer.h b/dbms/include/DB/IO/RemoteWriteBuffer.h index bc577812dfe..8ee3cf9f2b3 100644 --- a/dbms/include/DB/IO/RemoteWriteBuffer.h +++ b/dbms/include/DB/IO/RemoteWriteBuffer.h @@ -162,6 +162,7 @@ public: } catch (...) { + tryLogCurrentException(__PRETTY_FUNCTION__); } } diff --git a/dbms/include/DB/IO/WriteBufferFromFile.h b/dbms/include/DB/IO/WriteBufferFromFile.h index df22130ddc9..43bad6d705c 100644 --- a/dbms/include/DB/IO/WriteBufferFromFile.h +++ b/dbms/include/DB/IO/WriteBufferFromFile.h @@ -35,6 +35,7 @@ public: } catch (...) { + tryLogCurrentException(__PRETTY_FUNCTION__); } close(fd); diff --git a/dbms/include/DB/IO/WriteBufferFromFileDescriptor.h b/dbms/include/DB/IO/WriteBufferFromFileDescriptor.h index 1025c3e70b2..293d0a558a2 100644 --- a/dbms/include/DB/IO/WriteBufferFromFileDescriptor.h +++ b/dbms/include/DB/IO/WriteBufferFromFileDescriptor.h @@ -65,6 +65,7 @@ public: } catch (...) { + tryLogCurrentException(__PRETTY_FUNCTION__); } } diff --git a/dbms/include/DB/IO/WriteBufferFromHTTPServerResponse.h b/dbms/include/DB/IO/WriteBufferFromHTTPServerResponse.h index cf70b1b5ab3..f2155b4412a 100644 --- a/dbms/include/DB/IO/WriteBufferFromHTTPServerResponse.h +++ b/dbms/include/DB/IO/WriteBufferFromHTTPServerResponse.h @@ -56,6 +56,7 @@ public: } catch (...) { + tryLogCurrentException(__PRETTY_FUNCTION__); } } }; diff --git a/dbms/include/DB/IO/WriteBufferFromOStream.h b/dbms/include/DB/IO/WriteBufferFromOStream.h index 5ddee7aa99f..b41a34c6ff5 100644 --- a/dbms/include/DB/IO/WriteBufferFromOStream.h +++ b/dbms/include/DB/IO/WriteBufferFromOStream.h @@ -41,6 +41,7 @@ public: } catch (...) { + tryLogCurrentException(__PRETTY_FUNCTION__); } } }; diff --git a/dbms/include/DB/IO/WriteBufferFromPocoSocket.h b/dbms/include/DB/IO/WriteBufferFromPocoSocket.h index e188b58bc19..a8e0d439b57 100644 --- a/dbms/include/DB/IO/WriteBufferFromPocoSocket.h +++ b/dbms/include/DB/IO/WriteBufferFromPocoSocket.h @@ -62,6 +62,7 @@ public: } catch (...) { + tryLogCurrentException(__PRETTY_FUNCTION__); } } }; diff --git a/dbms/src/Core/Exception.cpp b/dbms/src/Core/Exception.cpp index ba94ba52d15..15aa3266242 100644 --- a/dbms/src/Core/Exception.cpp +++ b/dbms/src/Core/Exception.cpp @@ -1,6 +1,8 @@ #include #include +#include + #include #include @@ -82,6 +84,49 @@ ExceptionPtr cloneCurrentException() } +void tryLogCurrentException(const char * log_name) +{ + try + { + throw; + } + catch (const Exception & e) + { + try + { + LOG_ERROR(&Logger::get(log_name), "Code: " << e.code() << ", e.displayText() = " << e.displayText() << ", e.what() = " << e.what() + << ", Stack trace:\n\n" << e.getStackTrace().toString()); + } + catch (...) {} + } + catch (const Poco::Exception & e) + { + try + { + LOG_ERROR(&Logger::get(log_name), "Poco::Exception. Code: " << ErrorCodes::POCO_EXCEPTION << ", e.code() = " << e.code() + << ", e.displayText() = " << e.displayText() << ", e.what() = " << e.what()); + } + catch (...) {} + } + catch (const std::exception & e) + { + try + { + LOG_ERROR(&Logger::get(log_name), "std::exception. Code: " << ErrorCodes::STD_EXCEPTION << ", e.what() = " << e.what()); + } + catch (...) {} + } + catch (...) + { + try + { + LOG_ERROR(&Logger::get(log_name), "Unknown exception. Code: " << ErrorCodes::UNKNOWN_EXCEPTION); + } + catch (...) {} + } +} + + void rethrowFirstException(Exceptions & exceptions) { for (size_t i = 0, size = exceptions.size(); i < size; ++i)