forked from plumed/plumed2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Exception.cpp
90 lines (70 loc) · 2.5 KB
/
Exception.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Copyright (c) 2012-2016 The plumed team
(see the PEOPLE file at the root of the distribution for a list of names)
See http://www.plumed.org for more information.
This file is part of plumed, version 2.
plumed is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
plumed is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with plumed. If not, see <http://www.gnu.org/licenses/>.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
#include "Exception.h"
#if defined(__PLUMED_HAS_EXECINFO)
#include <execinfo.h>
#endif
#include <cstdio>
#include <cstdlib>
using namespace std;
namespace PLMD{
std::string Exception::format(const std::string&msg,const std::string&file,unsigned line,const std::string&function){
std::string message;
message="\n+++ Internal PLUMED error";
if(file.length()>0){
char cline[1000];
sprintf(cline,"%u",line);
message += "\n+++ file "+file+", line "+cline;
if(function.length()>0) message +=", function "+function;
}
if(msg.length()>0) message +="\n+++ message: "+msg;
return message;
}
Exception::Exception():
msg(format("","",0,""))
{
abortIfExceptionsAreDisabled();
}
Exception::Exception(const std::string&msg):
msg(format(msg,"",0,""))
{
abortIfExceptionsAreDisabled();
}
Exception::Exception(const std::string&msg,const std::string&file,unsigned line,const std::string&function):
msg(format(msg,file,line,function))
{
abortIfExceptionsAreDisabled();
}
void Exception::abortIfExceptionsAreDisabled(){
#if ! defined(__PLUMED_HAS_EXCEPTIONS)
#ifdef __PLUMED_HAS_EXECINFO
fprintf(stderr,"\n\n********** STACK DUMP **********\n");
void* callstack[128];
int i, frames = backtrace(callstack, 128);
char** strs = backtrace_symbols(callstack, frames);
for (i = 0; i < frames; ++i) {
fprintf(stderr,"%s\n", strs[i]);
}
fprintf(stderr,"******** END STACK DUMP ********\n");
free(strs);
#endif
fprintf(stderr,"%s",what());
fprintf(stderr,"\n");
std::abort();
#endif
}
}