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
46 
47 #if ML_DEPRECATED_SINCE(3,5,0)
48  #define ML_TRACE_IN(__classAndMethod___)
49  #define ML_TRACE_IN_TIME_CRITICAL(__classAndMethod___)
50 #endif
51 
52 #if ML_DEPRECATED_SINCE(3,5,0)
57  #define ML_TRACE_IN_TC(__classAndMethod___) ML_TRACE_IN_TIME_CRITICAL(__classAndMethod___)
58 
59  #if defined(WIN32) && !defined(ML_NO_DEPRECATED_WARNINGS)
60  #pragma deprecated("ML_TRACE_IN_TC")
61  #endif
63 #endif
64 
65 #if ML_DEPRECATED_SINCE(3,5,0)
66  #define ML_INTERNAL_ERROR_TRACE_IN(__classAndMethod___)
67 #endif
69 
70 
71  //----------------------------------------
76  //----------------------------------------
77 #ifdef _DEBUG
78  #define ML_TRY
79  #define ML_CATCH
80  #define ML_CATCH_RETURN
81  #define ML_CATCH_RETURN_FALSE
82  #define ML_CATCH_RETURN_NULL
83  #define ML_CATCH_RETHROW
84  #define ML_CATCH_BLOCK(__paramType) if (MLAlwaysFalse)
85 #else
86  #define ML_TRY try
87  #define ML_CATCH catch(...){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_UNKNOWN_EXCEPTION); }
88  #define ML_CATCH_RETURN catch(...){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_UNKNOWN_EXCEPTION); return; }
89  #define ML_CATCH_RETURN_FALSE catch(...){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_UNKNOWN_EXCEPTION); return false; }
90  #define ML_CATCH_RETURN_NULL catch(...){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_UNKNOWN_EXCEPTION); return 0; }
91  #define ML_CATCH_RETHROW catch(...){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_UNKNOWN_EXCEPTION); throw; }
92  #define ML_CATCH_BLOCK(__paramType) catch(__paramType)
93 #endif
94 
95 #if ML_DEPRECATED_SINCE(3,5,0)
100  #define ML_CATCH_R ML_CATCH_RETURN
103  #define ML_CATCH_RF ML_CATCH_RETURN_FALSE
106  #define ML_CATCH_RN ML_CATCH_RETURN_NULL
107 
108  #if defined(WIN32) && !defined(ML_NO_DEPRECATED_WARNINGS)
109  #pragma deprecated("ML_CATCH_R", "ML_CATCH_RF", "ML_CATCH_RN")
110  #endif
112 
113 #endif
115 
116 
117  //----------------------------------------
120  //----------------------------------------
121  #define ML_CHECK(x) if (!(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); }
122 #ifdef _DEBUG
123  #define ML_CHECK_ONLY_IN_DEBUG(x) ML_CHECK(x)
124 #else
125  #define ML_CHECK_ONLY_IN_DEBUG(x) /* Behaves like assert, not compiled in release mode */
126 #endif
127  #define ML_CHECK_RETURN(x) if (!(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); return; }
128  #define ML_CHECK_RETURN_FALSE(x) if (!(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); return false; }
129  #define ML_CHECK_RETURN_NULL(x) if (!(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); return 0; }
130  #define ML_CHECK_THROW(x) if (!(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); throw ML_BAD_POINTER_OR_0; }
131  #define ML_CHECK_RUNTIME_TYPE(x) if (!(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_TYPE_NOT_REGISTERED); throw ML_TYPE_NOT_REGISTERED; }
132 
134  #define ML_HARAKIRI MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0);
135 
136 #if ML_DEPRECATED_SINCE(3,5,0)
141  #define ML_CHECK_R(x) ML_CHECK_RETURN(x)
144  #define ML_CHECK_RF(x) ML_CHECK_RETURN_FALSE(x)
147  #define ML_CHECK_RN(x) ML_CHECK_RETURN_NULL(x)
150  #define ML_CHECK_TH(x) ML_CHECK_THROW(x)
151 
152  #if defined(WIN32) && !defined(ML_NO_DEPRECATED_WARNINGS)
153  #pragma deprecated("ML_CHECK_R", "ML_CHECK_RF", "ML_CHECK_RN", "ML_CHECK_TH")
154  #endif
156 #endif
158 
159 
160  //----------------------------------------
163  //----------------------------------------
164  #define ML_CHECK_FLOAT(x) if (MLValueIs0WOM(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); }
165  #define ML_CHECK_FLOAT_RETURN(x) if (MLValueIs0WOM(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); return; }
166  #define ML_CHECK_FLOAT_RETURN_FALSE(x) if (MLValueIs0WOM(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); return false; }
167  #define ML_CHECK_FLOAT_RETURN_NULL(x) if (MLValueIs0WOM(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); return 0; }
168  #define ML_CHECK_FLOAT_THROW(x) if (MLValueIs0WOM(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_BAD_POINTER_OR_0); throw ML_BAD_POINTER_OR_0; }
169  #define ML_CHECK_FLOAT_RUNTIME_TYPE(x) if (MLValueIs0WOM(x)){ MLPrintAndNotifyFatal(__FILE__, __LINE__, ML_TYPE_NOT_REGISTERED); throw ML_TYPE_NOT_REGISTERED; }
170 
171 #if ML_DEPRECATED_SINCE(3,5,0)
176  #define ML_CHECK_FLT_R(x) ML_CHECK_FLOAT_RETURN(x)
179  #define ML_CHECK_FLT_RF(x) ML_CHECK_FLOAT_RETURN_FALSE(x)
182  #define ML_CHECK_FLT_RN(x) ML_CHECK_FLOAT_RETURN_NULL(x)
185  #define ML_CHECK_FLT_TH(x) ML_CHECK_FLOAT_THROW(x)
186 
187  #if defined(WIN32) && !defined(ML_NO_DEPRECATED_WARNINGS)
188  #pragma deprecated("ML_CHECK_FLT_R", "ML_CHECK_FLT_RF", "ML_CHECK_FLT_RN", "ML_CHECK_FLT_TH")
189  #endif
191 #endif
193 
194 
195  //----------------------------------------
198  //----------------------------------------
199 
200 #if ML_DEPRECATED_SINCE(3,5,0)
201  template<typename T>
202  #ifndef ML_NO_DEPRECATED_WARNINGS
203  [[deprecated("ML_CHECK_NEW and ML_CHECK_NEW_TH from mlErrorMacros.h are deprecated since MeVisLab 3.5.0. Please use 'new' instead")]]
204  #endif
205  constexpr auto ml_deprecated_since_350_assign_check_new(T val) { return val; }
206 
207  #define ML_CHECK_NEW(var, exp) try{ (var) = ml_deprecated_since_350_assign_check_new(new exp); if (nullptr == (var)){ throw(ML_NO_MEMORY); } } catch(...){ MLPrintAndNotifyFatal(__FILE__, __LINE__, (nullptr == (var)) ? ML_NO_MEMORY : ML_CONSTRUCTOR_EXCEPTION); }
208  #define ML_CHECK_NEW_TH(var, exp) try{ (var) = ml_deprecated_since_350_assign_check_new(new exp); if (nullptr == (var)){ throw(ML_NO_MEMORY); } } catch(...){ MLPrintAndNotifyFatal(__FILE__, __LINE__, (nullptr == (var)) ? ML_NO_MEMORY : ML_CONSTRUCTOR_EXCEPTION); throw; }
209 #endif
210 
211 #if ML_DEPRECATED_SINCE(3,5,0)
212  template<typename T>
213  #ifndef ML_NO_DEPRECATED_WARNINGS
214  [[deprecated("ML_DELETE from mlErrorMacros.h is deprecated since MeVisLab 3.5.0. Please use 'delete' instead")]]
215  #endif
216  constexpr auto ml_deprecated_since_350_delete(T& val) { delete val; val = nullptr; }
217 
218  #define ML_DELETE(var) ml_deprecated_since_350_delete((var));
219 #endif
220 
221 #if ML_DEPRECATED_SINCE(3,5,0)
222  template<typename T>
223  #ifndef ML_NO_DEPRECATED_WARNINGS
224  [[deprecated("ML_DELETE_ARRAY from mlErrorMacros.h is deprecated since MeVisLab 3.5.0. Please use 'delete[]' instead")]]
225  #endif
226  constexpr auto ml_deprecated_since_350_delete_array(T& val) { delete[] val; val = nullptr; }
227  #define ML_DELETE_ARRAY(var) ml_deprecated_since_350_delete_array((var));
228 #endif
229 
230 
231 #if ML_DEPRECATED_SINCE(3,5,0)
236  #define ML_DELETE_ARR(var) ML_DELETE_ARRAY(var)
237 
238  #if defined(WIN32) && !defined(ML_NO_DEPRECATED_WARNINGS)
239  #pragma deprecated("ML_DELETE_ARR")
240  #endif
242 #endif
244 
245 
246 //-----------------------------------------------------------------------------------------------
249 //-----------------------------------------------------------------------------------------------
254 #define _ML_INFORMATION_ADD_ON(FUNC_NAME, REASON, HANDLING)
255 
260 #define _ML_WARNING_ADD_ON(FUNC_NAME, REASON, HANDLING)
261 
266 #define _ML_ERROR_ADD_ON(FUNC_NAME, REASON, HANDLING)
267 
272 #define _ML_FATAL_ERROR_ADD_ON(FUNC_NAME, REASON, HANDLING)
273 
279 #define _ML_ERROR_SHOW_ASSERT_BOX(PARAM)
281 
282 
283 
284 
285 
286 //--------------------------------------------------------------------------------------------
287 //
290 //
291 //--------------------------------------------------------------------------------------------
292 
293 //--------------------------------------------------------------------------------------------
306 //--------------------------------------------------------------------------------------------
307 #define _ML_PRINT_FATAL_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, RTYPE) \
308  { \
309  /* Get runtime information from RTYPE which could be a crashing expression.*/ \
310  const ML_UTILS_NAMESPACE::RuntimeType *rtt7645 = nullptr; \
311  try{ rtt7645 = RTYPE; if (MLAlwaysFalse){ throw ML_UNKNOWN_EXCEPTION;} } catch(...){ rtt7645 = nullptr; }\
312  _ML_FATAL_ERROR_ADD_ON(FUNC_NAME, REASON, HANDLING) \
313  ML_UTILS_NAMESPACE::MLErrorOutput.printAndNotify(ML_FATAL, \
314  ML_PREFIX, "Function=", FUNC_NAME, REASON, HANDLING, \
315  __FILE__, __LINE__, RT_OBJ, rtt7645); \
316  _ML_ERROR_SHOW_ASSERT_BOX(0); \
317  }
318 
319 //--------------------------------------------------------------------------------------------
332 //--------------------------------------------------------------------------------------------
333 #define _ML_PRINT_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, RTYPE) \
334  { \
335  /* Get runtime information from RTYPE which could be a crashing expression.*/ \
336  const ML_UTILS_NAMESPACE::RuntimeType *rtt1987 = nullptr; \
337  try{ rtt1987 = RTYPE; if (MLAlwaysFalse){ throw ML_UNKNOWN_EXCEPTION;} } catch(...){ rtt1987 = nullptr; }\
338  _ML_ERROR_ADD_ON(FUNC_NAME, REASON, HANDLING) \
339  ML_UTILS_NAMESPACE::MLErrorOutput.printAndNotify(ML_ERROR, \
340  ML_PREFIX, "Function=", FUNC_NAME, REASON, HANDLING, \
341  __FILE__, __LINE__, RT_OBJ, rtt1987); \
342  _ML_ERROR_SHOW_ASSERT_BOX(0); \
343  }
344 
345 //--------------------------------------------------------------------------------------------
359 //--------------------------------------------------------------------------------------------
360 #define _ML_PRINT_WARNING_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, RTYPE) \
361  { \
362  /* Get runtime information from RTYPE which could be a crashing expression.*/ \
363  const ML_UTILS_NAMESPACE::RuntimeType *rt9477 = nullptr; \
364  try{ rt9477 = RTYPE; if (MLAlwaysFalse){ throw ML_UNKNOWN_EXCEPTION;} } catch(...){ rt9477 = nullptr; } \
365  _ML_WARNING_ADD_ON(FUNC_NAME, REASON, HANDLING) \
366  ML_UTILS_NAMESPACE::MLErrorOutput.printAndNotify(ML_WARNING, \
367  ML_PREFIX, "Function=", FUNC_NAME, REASON, HANDLING, \
368  __FILE__, __LINE__, RT_OBJ, rt9477); \
369  /* No showing of assert box here. That would be to drastic. */ \
370  }
371 
372 //--------------------------------------------------------------------------------------------
386 //--------------------------------------------------------------------------------------------
387 #define _ML_PRINT_INFORMATION_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, RTYPE) \
388  { \
389  /* Get runtime information from RTYPE which could be a crashing expression.*/ \
390  const ML_UTILS_NAMESPACE::RuntimeType *rtAx598 = nullptr; \
391  try{ rtAx598 = RTYPE; if (MLAlwaysFalse){ throw ML_UNKNOWN_EXCEPTION;} } catch(...){ rtAx598 = nullptr; }\
392  _ML_INFORMATION_ADD_ON(FUNC_NAME, REASON, HANDLING) \
393  ML_UTILS_NAMESPACE::MLErrorOutput.printAndNotify(ML_INFORMATION, \
394  ML_PREFIX, "Function=", FUNC_NAME, REASON, HANDLING, \
395  __FILE__, __LINE__, RT_OBJ, rtAx598); \
396  /* No showing of assert box here. That would be to drastic. */ \
397  }
399 
400 
401 
402 //--------------------------------------------------------------------------------------------
403 //
406 //
407 //--------------------------------------------------------------------------------------------
408 //--------------------------------------------------------------------------------------------
411 //--------------------------------------------------------------------------------------------
412 #define ML_PRINT_FATAL_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ) \
413  /* Use OR with MLAlwaysFalse to avoid compiler warnings about unreachable code when constant RT_OBJ is passed from other macro. */ \
414  _ML_PRINT_FATAL_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, (((RT_OBJ) || MLAlwaysFalse) ? (RT_OBJ)->getTypeId() : nullptr))
415 
416 //--------------------------------------------------------------------------------------------
419 //--------------------------------------------------------------------------------------------
420 #define ML_PRINT_FATAL_ERROR_DUMP_NON_NULL(FUNC_NAME, REASON, HANDLING, RT_OBJ) \
421  _ML_PRINT_FATAL_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, (RT_OBJ)->getTypeId())
422 
423 //--------------------------------------------------------------------------------------------
426 //--------------------------------------------------------------------------------------------
427 #define ML_PRINT_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ) \
428  /* Use OR with MLAlwaysFalse to avoid compiler warnings about unreachable code when constant RT_OBJ is passed from other macro. */ \
429  _ML_PRINT_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, (((RT_OBJ) || MLAlwaysFalse) ? (RT_OBJ)->getTypeId() : nullptr))
430 
431 //--------------------------------------------------------------------------------------------
434 //--------------------------------------------------------------------------------------------
435 #define ML_PRINT_ERROR_DUMP_NON_NULL(FUNC_NAME, REASON, HANDLING, RT_OBJ) \
436  _ML_PRINT_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, (RT_OBJ)->getTypeId())
437 
438 //--------------------------------------------------------------------------------------------
441 //--------------------------------------------------------------------------------------------
442 #define ML_PRINT_WARNING_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ) \
443  /* Use OR with MLAlwaysFalse to avoid compiler warnings about unreachable code when constant RT_OBJ is passed from other macro. */ \
444  _ML_PRINT_WARNING_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, (((RT_OBJ) || MLAlwaysFalse) ? (RT_OBJ)->getTypeId() : nullptr))
445 
446 //--------------------------------------------------------------------------------------------
449 //--------------------------------------------------------------------------------------------
450 #define ML_PRINT_INFORMATION_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ) \
451  /* Use OR with MLAlwaysFalse to avoid compiler warnings about unreachable code when constant RT_OBJ is passed from other macro. */ \
452  _ML_PRINT_INFORMATION_DUMP(FUNC_NAME, REASON, HANDLING, RT_OBJ, (((RT_OBJ) || MLAlwaysFalse) ? (RT_OBJ)->getTypeId() : nullptr))
453 
455 
456 
457 
458 //--------------------------------------------------------------------------------------------
459 //
462 //
463 //--------------------------------------------------------------------------------------------
464 
465 //--------------------------------------------------------------------------------------------
470 //--------------------------------------------------------------------------------------------
471 #define ML_PRINT_FATAL_ERROR(FUNC_NAME, REASON, HANDLING) \
472  _ML_PRINT_FATAL_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, nullptr, nullptr)
473 
474 //--------------------------------------------------------------------------------------------
479 //--------------------------------------------------------------------------------------------
480 #define ML_PRINT_ERROR(FUNC_NAME, REASON, HANDLING) \
481  _ML_PRINT_ERROR_DUMP(FUNC_NAME, REASON, HANDLING, nullptr, nullptr)
482 
483 //--------------------------------------------------------------------------------------------
488 //--------------------------------------------------------------------------------------------
489 #define ML_PRINT_WARNING(FUNC_NAME, REASON, HANDLING) \
490  _ML_PRINT_WARNING_DUMP(FUNC_NAME, REASON, HANDLING, nullptr, nullptr)
491 
492 //--------------------------------------------------------------------------------------------
497 //--------------------------------------------------------------------------------------------
498 #define ML_PRINT_INFORMATION(FUNC_NAME, REASON, HANDLING) \
499  _ML_PRINT_INFORMATION_DUMP(FUNC_NAME, REASON, HANDLING, nullptr, nullptr)
500 
501 //--------------------------------------------------------------------------------------------
505 //--------------------------------------------------------------------------------------------
506 #define ML_PRINT_INFO(FUNC_NAME, HANDLING) \
507  _ML_PRINT_INFORMATION_DUMP(FUNC_NAME, ML_RESULT_OK, HANDLING, nullptr, nullptr)
508 
510 
511 
512 
513 
514 #endif
515 
516 
@ T
Definition: SoKeyGrabber.h:71