MeVisLab Toolbox Reference
mlErrorMacros.h
Go to the documentation of this file.
1
/*************************************************************************************
2
**
3
** Copyright 2007, MeVis Medical Solutions AG
4
**
5
** The user may use this file in accordance with the license agreement provided with
6
** the Software or, alternatively, in accordance with the terms contained in a
7
** written agreement between the user and MeVis Medical Solutions AG.
8
**
9
** For further information use the contact form at https://www.mevislab.de/contact
10
**
11
**************************************************************************************/
12
13
#ifndef ML_ERROR_MACROS_H
14
#define ML_ERROR_MACROS_H
15
18
#include <utility>
19
#include <type_traits>
20
#include "
mlConfig.h
"
21
22
#include "
mlMacros.h
"
23
24
// ------------------------------------------------------
25
// Disabling some bogus warnings in MeVis release mode
26
// ------------------------------------------------------
27
#if defined(_MSC_VER)
28
#pragma warning(push)
29
#if !defined(_DEBUG)
30
#pragma warning(disable: 4701)
// local variable *may* be used without init
31
#pragma warning(disable: 4702)
// unreachable code
32
#pragma warning(disable: 4710)
// private constructors are disallowed
33
#pragma warning(disable: 4097)
// typedef-name 'identifier1' used as synonym for class-name 'identifier2'
34
#pragma warning(disable: 4512)
// 'class' : assignment operator could not be generated
35
#pragma warning(disable: 4127)
// conditional expression is constant
36
#pragma warning(disable: 4711)
// selected for automatic inline expansion
37
#endif
38
#pragma warning(disable: 4127)
// conditional expression is constant
39
#endif
40
41
#include "
mlLogging.h
"
42
43
#if defined(_MSC_VER)
44
#pragma warning(pop)
45
#endif
47
48
49
//----------------------------------------
54
//----------------------------------------
55
#ifdef _DEBUG
56
#define ML_TRY
57
#define ML_CATCH
58
#define ML_CATCH_RETURN
59
#define ML_CATCH_RETURN_FALSE
60
#define ML_CATCH_RETURN_NULL
61
#define ML_CATCH_RETHROW
62
#define ML_CATCH_BLOCK(__paramType) if (MLAlwaysFalse)
63
#else
64
#define ML_TRY try
65
#define ML_CATCH catch(...){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_UNKNOWN_EXCEPTION); }
66
#define ML_CATCH_RETURN catch(...){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_UNKNOWN_EXCEPTION); return; }
67
#define ML_CATCH_RETURN_FALSE catch(...){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_UNKNOWN_EXCEPTION); return false; }
68
#define ML_CATCH_RETURN_NULL catch(...){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_UNKNOWN_EXCEPTION); return 0; }
69
#define ML_CATCH_RETHROW catch(...){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_UNKNOWN_EXCEPTION); throw; }
70
#define ML_CATCH_BLOCK(__paramType) catch(__paramType)
71
#endif
72
74
75
76
//----------------------------------------
79
//----------------------------------------
80
#define ML_CHECK(x) if (!(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); }
81
#ifdef _DEBUG
82
#define ML_CHECK_ONLY_IN_DEBUG(x) ML_CHECK(x)
83
#else
84
#define ML_CHECK_ONLY_IN_DEBUG(x)
/* Behaves like assert, not compiled in release mode */
85
#endif
86
#define ML_CHECK_RETURN(x) if (!(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); return; }
87
#define ML_CHECK_RETURN_FALSE(x) if (!(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); return false; }
88
#define ML_CHECK_RETURN_NULL(x) if (!(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); return 0; }
89
#define ML_CHECK_THROW(x) if (!(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); throw ML_BAD_POINTER_OR_0; }
90
#define ML_CHECK_RUNTIME_TYPE(x) if (!(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_TYPE_NOT_REGISTERED); throw ML_TYPE_NOT_REGISTERED; }
91
93
#define ML_HARAKIRI MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0);
94
96
97
98
//----------------------------------------
101
//----------------------------------------
102
#define ML_CHECK_FLOAT(x) if (MLValueIs0WOM(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); }
103
#define ML_CHECK_FLOAT_RETURN(x) if (MLValueIs0WOM(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); return; }
104
#define ML_CHECK_FLOAT_RETURN_FALSE(x) if (MLValueIs0WOM(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); return false; }
105
#define ML_CHECK_FLOAT_RETURN_NULL(x) if (MLValueIs0WOM(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); return 0; }
106
#define ML_CHECK_FLOAT_THROW(x) if (MLValueIs0WOM(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); throw ML_BAD_POINTER_OR_0; }
107
#define ML_CHECK_FLOAT_RUNTIME_TYPE(x) if (MLValueIs0WOM(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_TYPE_NOT_REGISTERED); throw ML_TYPE_NOT_REGISTERED; }
108
110
111
112
//-----------------------------------------------------------------------------------------------
115
//-----------------------------------------------------------------------------------------------
120
#define _ML_INFORMATION_ADD_ON(FUNC_NAME, REASON, HANDLING)
121
126
#define _ML_WARNING_ADD_ON(FUNC_NAME, REASON, HANDLING)
127
132
#define _ML_ERROR_ADD_ON(FUNC_NAME, REASON, HANDLING)
133
138
#define _ML_FATAL_ERROR_ADD_ON(FUNC_NAME, REASON, HANDLING)
139
145
#define _ML_ERROR_SHOW_ASSERT_BOX(PARAM)
147
148
149
150
151
152
//--------------------------------------------------------------------------------------------
153
//
156
//
157
//--------------------------------------------------------------------------------------------
158
159
//--------------------------------------------------------------------------------------------
172
//--------------------------------------------------------------------------------------------
173
#define _ML_PRINT_FATAL_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, RTYPE) \
174
{ \
175
/* Get runtime information from RTYPE which could be a crashing expression.*/
\
176
const ML_UTILS_NAMESPACE::RuntimeType *rtt7645 = nullptr; \
177
try{ rtt7645 = RTYPE; if (MLAlwaysFalse){ throw ML_UNKNOWN_EXCEPTION;} } catch(...){ rtt7645 = nullptr; }\
178
_ML_FATAL_ERROR_ADD_ON(FUNC_NAME, REASON, HANDLING) \
179
ML_UTILS_NAMESPACE::MLErrorOutput.printAndNotify(ML_FATAL, \
180
ML_PREFIX, "Function=", FUNC_NAME, REASON, HANDLING, \
181
__FILE__, __LINE__, RT_OBJ, rtt7645); \
182
_ML_ERROR_SHOW_ASSERT_BOX(0); \
183
}
184
185
//--------------------------------------------------------------------------------------------
198
//--------------------------------------------------------------------------------------------
199
#define _ML_PRINT_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, RTYPE) \
200
{ \
201
/* Get runtime information from RTYPE which could be a crashing expression.*/
\
202
const ML_UTILS_NAMESPACE::RuntimeType *rtt1987 = nullptr; \
203
try{ rtt1987 = RTYPE; if (MLAlwaysFalse){ throw ML_UNKNOWN_EXCEPTION;} } catch(...){ rtt1987 = nullptr; }\
204
_ML_ERROR_ADD_ON(FUNC_NAME, REASON, HANDLING) \
205
ML_UTILS_NAMESPACE::MLErrorOutput.printAndNotify(ML_ERROR, \
206
ML_PREFIX, "Function=", FUNC_NAME, REASON, HANDLING, \
207
__FILE__, __LINE__, RT_OBJ, rtt1987); \
208
_ML_ERROR_SHOW_ASSERT_BOX(0); \
209
}
210
211
//--------------------------------------------------------------------------------------------
225
//--------------------------------------------------------------------------------------------
226
#define _ML_PRINT_WARNING_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, RTYPE) \
227
{ \
228
/* Get runtime information from RTYPE which could be a crashing expression.*/
\
229
const ML_UTILS_NAMESPACE::RuntimeType *rt9477 = nullptr; \
230
try{ rt9477 = RTYPE; if (MLAlwaysFalse){ throw ML_UNKNOWN_EXCEPTION;} } catch(...){ rt9477 = nullptr; } \
231
_ML_WARNING_ADD_ON(FUNC_NAME, REASON, HANDLING) \
232
ML_UTILS_NAMESPACE::MLErrorOutput.printAndNotify(ML_WARNING, \
233
ML_PREFIX, "Function=", FUNC_NAME, REASON, HANDLING, \
234
__FILE__, __LINE__, RT_OBJ, rt9477); \
235
/* No showing of assert box here. That would be to drastic. */
\
236
}
237
238
//--------------------------------------------------------------------------------------------
252
//--------------------------------------------------------------------------------------------
253
#define _ML_PRINT_INFORMATION_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, RTYPE) \
254
{ \
255
/* Get runtime information from RTYPE which could be a crashing expression.*/
\
256
const ML_UTILS_NAMESPACE::RuntimeType *rtAx598 = nullptr; \
257
try{ rtAx598 = RTYPE; if (MLAlwaysFalse){ throw ML_UNKNOWN_EXCEPTION;} } catch(...){ rtAx598 = nullptr; }\
258
_ML_INFORMATION_ADD_ON(FUNC_NAME, REASON, HANDLING) \
259
ML_UTILS_NAMESPACE::MLErrorOutput.printAndNotify(ML_INFORMATION, \
260
ML_PREFIX, "Function=", FUNC_NAME, REASON, HANDLING, \
261
__FILE__, __LINE__, RT_OBJ, rtAx598); \
262
/* No showing of assert box here. That would be to drastic. */
\
263
}
265
266
267
268
//--------------------------------------------------------------------------------------------
269
//
272
//
273
//--------------------------------------------------------------------------------------------
274
//--------------------------------------------------------------------------------------------
277
//--------------------------------------------------------------------------------------------
278
#define ML_PRINT_FATAL_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ) \
279
/* Use OR with MLAlwaysFalse to avoid compiler warnings about unreachable code when constant RT_OBJ is passed from other macro. */
\
280
_ML_PRINT_FATAL_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, (((RT_OBJ) || MLAlwaysFalse) ? (RT_OBJ)->getTypeId() : nullptr))
281
282
//--------------------------------------------------------------------------------------------
285
//--------------------------------------------------------------------------------------------
286
#define ML_PRINT_FATAL_ERROR_DUMP_NON_NULL(FUNC_NAME, REASON, HANDLING, RT_OBJ) \
287
_ML_PRINT_FATAL_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, (RT_OBJ)->getTypeId())
288
289
//--------------------------------------------------------------------------------------------
292
//--------------------------------------------------------------------------------------------
293
#define ML_PRINT_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ) \
294
/* Use OR with MLAlwaysFalse to avoid compiler warnings about unreachable code when constant RT_OBJ is passed from other macro. */
\
295
_ML_PRINT_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, (((RT_OBJ) || MLAlwaysFalse) ? (RT_OBJ)->getTypeId() : nullptr))
296
297
//--------------------------------------------------------------------------------------------
300
//--------------------------------------------------------------------------------------------
301
#define ML_PRINT_ERROR_DUMP_NON_NULL(FUNC_NAME, REASON, HANDLING, RT_OBJ) \
302
_ML_PRINT_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, (RT_OBJ)->getTypeId())
303
304
//--------------------------------------------------------------------------------------------
307
//--------------------------------------------------------------------------------------------
308
#define ML_PRINT_WARNING_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ) \
309
/* Use OR with MLAlwaysFalse to avoid compiler warnings about unreachable code when constant RT_OBJ is passed from other macro. */
\
310
_ML_PRINT_WARNING_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, (((RT_OBJ) || MLAlwaysFalse) ? (RT_OBJ)->getTypeId() : nullptr))
311
312
//--------------------------------------------------------------------------------------------
315
//--------------------------------------------------------------------------------------------
316
#define ML_PRINT_INFORMATION_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ) \
317
/* Use OR with MLAlwaysFalse to avoid compiler warnings about unreachable code when constant RT_OBJ is passed from other macro. */
\
318
_ML_PRINT_INFORMATION_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, (((RT_OBJ) || MLAlwaysFalse) ? (RT_OBJ)->getTypeId() : nullptr))
319
321
322
323
324
//--------------------------------------------------------------------------------------------
325
//
328
//
329
//--------------------------------------------------------------------------------------------
330
331
//--------------------------------------------------------------------------------------------
336
//--------------------------------------------------------------------------------------------
337
#define ML_PRINT_FATAL_ERROR(FUNC_NAME, REASON, HANDLING) \
338
_ML_PRINT_FATAL_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, nullptr, nullptr)
339
340
//--------------------------------------------------------------------------------------------
345
//--------------------------------------------------------------------------------------------
346
#define ML_PRINT_ERROR(FUNC_NAME, REASON, HANDLING) \
347
_ML_PRINT_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, nullptr, nullptr)
348
349
//--------------------------------------------------------------------------------------------
354
//--------------------------------------------------------------------------------------------
355
#define ML_PRINT_WARNING(FUNC_NAME, REASON, HANDLING) \
356
_ML_PRINT_WARNING_DUMP(FUNC_NAME, REASON, HANDLING, nullptr, nullptr)
357
358
//--------------------------------------------------------------------------------------------
363
//--------------------------------------------------------------------------------------------
364
#define ML_PRINT_INFORMATION(FUNC_NAME, REASON, HANDLING) \
365
_ML_PRINT_INFORMATION_DUMP(FUNC_NAME, REASON, HANDLING, nullptr, nullptr)
366
367
//--------------------------------------------------------------------------------------------
371
//--------------------------------------------------------------------------------------------
372
#define ML_PRINT_INFO(FUNC_NAME, HANDLING) \
373
_ML_PRINT_INFORMATION_DUMP(FUNC_NAME, ML_RESULT_OK, HANDLING, nullptr, nullptr)
374
376
377
378
379
380
#endif
381
382
mlConfig.h
mlLogging.h
mlMacros.h
MeVis
Foundation
Sources
MLUtilities
mlErrorMacros.h
Generated by
1.10.0