terror_handling.hh - pism - [fork] customized build of PISM, the parallel ice sheet model (tillflux branch)
HTML git clone git://src.adamsgaard.dk/pism
DIR Log
DIR Files
DIR Refs
DIR LICENSE
---
terror_handling.hh (2894B)
---
1 /* Copyright (C) 2014, 2015, 2016, 2018, 2019 PISM Authors
2 *
3 * This file is part of PISM.
4 *
5 * PISM is free software; you can redistribute it and/or modify it under the
6 * terms of the GNU General Public License as published by the Free Software
7 * Foundation; either version 3 of the License, or (at your option) any later
8 * version.
9 *
10 * PISM is distributed in the hope that it will be useful, but WITHOUT ANY
11 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13 * details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with PISM; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20 #ifndef _ERROR_HANDLING_H_
21 #define _ERROR_HANDLING_H_
22
23 #include <mpi.h> // MPI_Comm
24 #include <stdexcept>
25 #include <string>
26 #include <vector>
27
28 #include "pism/pism_config.hh" // Pism_DEBUG
29
30
31 namespace pism {
32
33 class ErrorLocation {
34 public:
35 ErrorLocation();
36 ErrorLocation(const char *name, int line);
37 const char *filename;
38 int line_number;
39 };
40
41 #if Pism_DEBUG==1
42 #define PISM_ERROR_LOCATION pism::ErrorLocation(__FILE__, __LINE__)
43 #else
44 #define PISM_ERROR_LOCATION pism::ErrorLocation()
45 #endif
46
47 class RuntimeError : public std::runtime_error {
48 public:
49 RuntimeError(const ErrorLocation &location, const std::string &message);
50 ~RuntimeError() throw();
51
52 typedef void (*Hook)(RuntimeError*);
53
54 //! @brief build a RuntimeError with a formatted message
55 static RuntimeError formatted(const ErrorLocation &location, const char format[], ...) __attribute__((format(printf, 2, 3)));
56
57 static void set_hook(Hook new_hook);
58
59 //! @brief Add a message providing some context. This way we can (sort of)
60 //! get a stack trace even though C++ exceptions do not provide one.
61 void add_context(const std::string &message);
62 void add_context(const char format[], ...) __attribute__((format(printf, 2, 3)));
63 void print(MPI_Comm com);
64 protected:
65 std::vector<std::string> m_context;
66 static Hook sm_hook;
67 ErrorLocation m_location;
68 };
69
70 class ParallelSection {
71 public:
72 ParallelSection(MPI_Comm com);
73 ~ParallelSection();
74 void check();
75 void failed();
76 void reset();
77 private:
78 bool m_failed;
79 MPI_Comm m_com;
80 };
81
82 void handle_fatal_errors(MPI_Comm com);
83
84 void check_c_call(int errcode, int success, const char* function_name,
85 const char *file, int line);
86
87 void check_petsc_call(int errcode, const char* function_name,
88 const char *file, int line);
89
90 #define PISM_C_CHK(errcode,success,name) do { pism::check_c_call(errcode, success, name, __FILE__, __LINE__); } while (0)
91 #define PISM_CHK(errcode,name) do { pism::check_petsc_call(errcode, name, __FILE__, __LINE__); } while (0)
92
93 } // end of namespace pism
94
95 #endif /* _ERROR_HANDLING_H_ */