Files
2024-02-27 14:55:36 +08:00

199 lines
4.9 KiB
C++

/*****************************************************************************
* HException.h
*****************************************************************************
*
* Project: HALCON/C++
* Description: Error handling
*
* (c) 2010-2020 by MVTec Software GmbH
* www.mvtec.com
*
*****************************************************************************
*
*
*****************************************************************************/
#ifndef HCPP_EXCEPTION_H
#define HCPP_EXCEPTION_H
#include "halconcpp/HString.h"
#include "halconcpp/HTuple.h"
namespace HalconCpp
{
// Base class for all exception that is raised for generic
// errors within the HALCON/C++ interface
class LIntExport HException
{
public:
// Constructors / Destructor
HException(const char *proc_name, Herror err);
HException(const char *proc_name, const char *msg, Herror err = H_MSG_OK);
HException(const HException &except);
HException(const HTuple &tuple);
virtual ~HException();
// Raising exceptions (synchronization-aware)
virtual void ThrowInstance() const;
static void Throw(const char *proc_name, const char *msg, Herror err = H_MSG_OK);
static void Throw(const char *proc_name, Herror err);
// Conversion and copying
static void GetExceptionData(const HTuple &exception,
const HTuple &name, HTuple *value);
void ToHTuple(HTuple *exception) const;
HException& operator = (const HException &except);
// Accessors
const HString& ProcName() const {return mProcName;}
const HString& ErrorMessage() const {return mErrorMessage;}
Herror ErrorCode() const {return mErrorCode;}
HDEPRECATED(const HString& ErrorText() const ,
"deprecated, please use ErrorMessage instead.")
{return mErrorMessage;}
HDEPRECATED(Herror ErrorNumber() const ,
"deprecated, please use ErrorCode instead.")
{return mErrorCode;}
const HTuple& UserData() const {return mUserData;}
// Legacy
#ifdef HCPP_LEGACY_EXCEPTION
// Handler for user defined exception handling.
// Used with InstallHHandler()
typedef void (*Handler)(const HException &exception);
void React(Hproc_handle proc_handle) const;
static Handler InstallHHandler(Handler proc);
// default exception handler
void PrintException(void) const;
static Handler handler; /* handler in use */
#endif
protected:
HString mProcName; // Name of procedure/operator
HString mErrorMessage; // Error message
Herror mErrorCode; // Error code
HTuple mUserData; // User defined error data
private:
void InitException(const HString& proc_name, const HString& msg,
Herror err, const HTuple& user_data);
};
// Exception that is raised if operator call in HALCON library fails
class LIntExport HOperatorException : public HException
{
public:
// Failure during operator call
HOperatorException(Hproc_handle proc, Herror err);
// Precall failure before procedure handle is available
HOperatorException(HINT proc_index, Herror err);
// Failure during operator-like call, e.g. emulated dev_* operators
HOperatorException(const char* name, Herror err);
HOperatorException(const HOperatorException &except);
static void Throw(Hproc_handle proc, Herror err);
static void Throw(HINT proc_index, Herror err);
static void Throw(const char* name, Herror err);
void ThrowInstance() const;
// Extended Error Info
HString ExtendedErrorMessage() const;
INT4_8 ExtendedErrorCode() const;
};
// Exception that is raised from user code (code export)
class LIntExport HUserException : public HException
{
public:
HUserException(Herror err, const char *msg);
HUserException(const HUserException &except);
HUserException(const HTuple &tuple);
};
// Exception that is raised for tuple-related errors
class LIntExport HTupleAccessException: public HException
{
public:
HTupleAccessException(void) : HException("","Illegal operation on tuple") {}
HTupleAccessException(const char *m) : HException("",m) {}
HTupleAccessException(Herror err) : HException("",err) {}
static void Throw(void);
static void Throw(const char* m);
static void Throw(Herror err);
void ThrowInstance() const;
~HTupleAccessException();
};
// Exception that is raised for vector-related errors
class LIntExport HVectorAccessException: public HException
{
public:
HVectorAccessException(void) : HException("",
"Illegal operation on vector") {}
HVectorAccessException(const char *m) : HException("",m) {}
HVectorAccessException(Herror err) : HException("",err) {}
HVectorAccessException(const char *m, Herror err) : HException("",m,err) {}
static void Throw(void);
static void Throw(const char* m);
static void Throw(Herror err);
void ThrowInstance() const;
~HVectorAccessException();
};
}
#endif