TextException.cc
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2018 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 #include "squid.h"
10 #include "base/TextException.h"
11 #include "sbuf/SBuf.h"
12 
13 #include <iostream>
14 #include <sstream>
15 #include <unordered_map>
16 
18 typedef std::runtime_error WhatString;
19 
21 typedef std::unordered_multimap<const void*, WhatString> WhatStrings;
22 
24 static WhatStrings *WhatStrings_ = nullptr;
25 
27  TextException(message.c_str(), location)
28 {}
29 
31 {
32  if (WhatStrings_)
33  WhatStrings_->erase(this); // there only if what() has been called
34 }
35 
36 std::ostream &
37 TextException::print(std::ostream &os) const
38 {
39  os << std::runtime_error::what() << "\n" <<
40  " exception location: " << where << "\n";
41  // TODO: error_detail: " << (ERR_DETAIL_EXCEPTION_START+id()) << "\n";
42  return os;
43 }
44 
45 const char *
46 TextException::what() const throw()
47 {
48  std::ostringstream os;
49  print(os);
50  const WhatString result(os.str());
51 
52  // extend result.c_str() lifetime to this object lifetime
53  if (!WhatStrings_)
55  // *this could change, but we must preserve old results for they may be used
56  WhatStrings_->emplace(std::make_pair(this, result));
57 
58  return result.what();
59 }
60 
61 std::ostream &
62 CurrentException(std::ostream &os)
63 {
64  if (std::current_exception()) {
65  try {
66  throw; // re-throw to recognize the exception type
67  }
68  catch (const std::exception &ex) {
69  os << ex.what();
70  }
71  catch (...) {
72  os << "[unknown exception type]";
73  }
74  } else {
75  os << "[no active exception]";
76  }
77  return os;
78 }
79 
std::ostream & print(std::ostream &) const
dumps the exception text into the stream
Definition: SBuf.h:86
TextException(const char *message, const SourceLocation &location)
Definition: TextException.h:23
virtual const char * what() const override
std::unordered_multimap< const void *, WhatString > WhatStrings
a collection of strings indexed by pointers to their creator objects
SourceLocation where
code location related to the exception; usually the thrower location
Definition: TextException.h:45
virtual ~TextException() override
std::ostream & CurrentException(std::ostream &os)
prints active (i.e., thrown but not yet handled) exception
an std::runtime_error with thrower location info
Definition: TextException.h:19
a source code location that is cheap to create, copy, and store
Definition: Here.h:29
static WhatStrings * WhatStrings_
requested what() strings of alive TextException objects
std::runtime_error WhatString
a standard CoW string; avoids noise and circular dependencies of SBuf

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors