1//
2// Bugcheck.cpp
3//
4// Library: Foundation
5// Package: Core
6// Module: Bugcheck
7//
8// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
9// and Contributors.
10//
11// SPDX-License-Identifier: BSL-1.0
12//
13
14
15#include "Poco/Bugcheck.h"
16#include "Poco/Debugger.h"
17#include "Poco/NestedDiagnosticContext.h"
18#include "Poco/Exception.h"
19#include <sstream>
20
21
22namespace Poco {
23
24
25void Bugcheck::assertion(const char* cond, const char* file, int line, const char* text)
26{
27 std::string message("Assertion violation: ");
28 message += cond;
29 if (text)
30 {
31 message += " (";
32 message += text;
33 message += ")";
34 }
35 Debugger::enter(message, file, line);
36 throw AssertionViolationException(what(cond, file, line, text));
37}
38
39
40void Bugcheck::nullPointer(const char* ptr, const char* file, int line)
41{
42 Debugger::enter(std::string("NULL pointer: ") + ptr, file, line);
43 throw NullPointerException(what(ptr, file, line));
44}
45
46
47void Bugcheck::bugcheck(const char* file, int line)
48{
49 Debugger::enter("Bugcheck", file, line);
50 throw BugcheckException(what(0, file, line));
51}
52
53
54void Bugcheck::bugcheck(const char* msg, const char* file, int line)
55{
56 std::string m("Bugcheck");
57 if (msg)
58 {
59 m.append(": ");
60 m.append(msg);
61 }
62 Debugger::enter(m, file, line);
63 throw BugcheckException(what(msg, file, line));
64}
65
66
67void Bugcheck::unexpected(const char* file, int line)
68{
69#ifdef _DEBUG
70 try
71 {
72 std::string msg("Unexpected exception in noexcept function or destructor: ");
73 try
74 {
75 throw;
76 }
77 catch (Poco::Exception& exc)
78 {
79 msg += exc.displayText();
80 }
81 catch (std::exception& exc)
82 {
83 msg += exc.what();
84 }
85 catch (...)
86 {
87 msg += "unknown exception";
88 }
89 Debugger::enter(msg, file, line);
90 }
91 catch (...)
92 {
93 }
94#endif
95}
96
97
98void Bugcheck::debugger(const char* file, int line)
99{
100 Debugger::enter(file, line);
101}
102
103
104void Bugcheck::debugger(const char* msg, const char* file, int line)
105{
106 Debugger::enter(msg, file, line);
107}
108
109
110std::string Bugcheck::what(const char* msg, const char* file, int line, const char* text)
111{
112 std::ostringstream str;
113 if (msg) str << msg << " ";
114 if (text != NULL) str << "(" << text << ") ";
115 str << "in file \"" << file << "\", line " << line;
116#ifdef POCO_EXCEPTION_BACKTRACE
117 str << std::endl << NDC::backtrace(3, 2);
118#endif // POCO_EXCEPTION_BACKTRACE
119 return str.str();
120}
121
122
123} // namespace Poco
124