'Exception'에 해당되는 글 2건

예외(Exception) : 기대하지 않는 사건

Neo 가 짠 코드에서는 Exception 이 발생하지 않는다. 왜냐, 그는 The One 이기 때문이다. 

하지만, 내가 짠 코드에는 예외 투성이다. 왜냐, 난 평민이기 때문이다. ㅋ

서버 프로그램을 수정하여 올렸는데, 젠장할, 내가 테스트 할때는 문제가 없다가 다른 사람이 테스트하니 시스템이 뻗어 버린다.

디버거로 돌려 보니, 한 두군에서 Access Violation 부터 가지가지 문제가 발생하여, 땜방 땜빵,,,,,

예전에 Structured Exception Handling을 읽어보긴 했는데, 실제 Null Pointer reference로 인한 문제에서 허우적 거리니, 

기초 실력이 얼마나 중요한지 다시 깨닫고, C++ 개발자면서 기초가 되는 내용들은 공부안하고, 서브가 되는 것들만 공부하지 않았나 싶다.

여기서 나오는 내용은 제프리 리처의 Windows VIA C/C++ 책을 보면서 공부한 내용을 다시 정리하는 것이다.

기본적인 예외 처리에 대한 문법은 다음과 같다.


일반 C++ try-catch 구문과 같은 문법이다. 하지만, C++ 예외 처리기와 SEH는 다른 것이다. 비주얼 스튜디오에서 사용하는 Visual C++ 예외 처리기 또한 C++ 예외 처리를 지원하고 있으며, 내부적으로는 컴파일러와 윈도우가 지원하는 SEH를 이용하여 구현되어 있다. SEH의 동작 방식과 처리 방식에 따라 C++ 예외 처리기 및 MFC 예외 처리를 구현했다는 것이다. SEH 가 부모가 되고, C++ 예외 처리기는 자식이 되는 것이다.



다음과 같은 함수가 실행된다고 했을때, 출력 창에 출력되는 내용은 다음과 같다.



 보호되고 있는 try 내의 start try 가 출력이 되는데, 그 다음 열의 dwTemp = 5 / dwTemp 열에서 0으로 나누는 에러가 발생하여 Exception이 발생하게 되었다. 따라서, 바로 다음 구문으로 end try가 출력되는 것이 아니라, __except 구문으로 빠져 나가게 된다. __except 구문의 예외 필터는
EXCEPTION_EXECUTE_HANDLER 이다. 예외 필터가 EXCEPTION_EXECUTE_HANDLER 일 경우 코드는 글로벌 언와인드를 하게 된다. 글로벌 언와인드를 하고 나서 함수의 끝에 있는 End of func 를 출력하게 된다.

예외 필터는 다음과 같이 3가지가 있다.
EXCEPTION_EXECUTE_HANDLER
EXCEPTION_CONTINUE_SEARCH
EXCEPTION_CONTINUE_EXECUTION

예외 필터를 각각 바꾸어서 어떻게 다르게 처리되는지 알아보자. 우선 EXCEPTION_CONTINUE_SEARCH 로 변경하서 실행하게 되면 다음과 같이
출력된다.



마찬가지로 0 으로 나누는 예외가 발생하였는데 예외 필터가 EXCEPTION_CONTINUE_SEARCH 이기 때문에, 다음 구문으로 넘어가지 않고 그 상위 try 구문을 찾아 0으로 나누는 예외가 발생할 경우 어떻게 처리해야되는지 정의 되어 있는지를 찾게된다. 이름에서 알 수 있듯이 해당 예외를 처리할 try 블록을 계속 찾는 다는 것이다.

아래는 EXCEPTION_CONTINUE_EXECUTE 이다.



EXCEPTION_CONTINUE_EXECUTE의 경우 계속 0으로 나오는 예외가 발생했다고 알려주는 메시지만 출력하는 무한 루프에 빠지게된다.
예외가 발생해도 계속 실행하라.는 구문으로 dwTemp = 5 / dwTemp를 계속 실행하기 때문에, 예외 문구가 게속 출력되는 것이다.

아래 그림은 전체적으로 시스템에서 예외가 발생하였을 경우 처리되는 순서이다.







------------------------------------------------------------------------------------------------------------------------------------

제프리 리처의 WINDOWS VIA C/C++
카테고리 컴퓨터/IT
지은이 제프리 리처 (한빛미디어, 2008년)
상세보기




저작자 표시
신고
블로그 이미지

Moonistar moonistar

SQL Error Code

[04] programming 2009.02.19 09:20
MFC Library Reference
CDBException::m_nRetCode

Contains an ODBC error code of type RETCODE returned by an ODBC application programming interface (API) function.

Remarks

This type includes SQL-prefixed codes defined by ODBC and AFX_SQL-prefixed codes defined by the database classes. For a CDBException, this member will contain one of the following values:

  • AFX_SQL_ERROR_API_CONFORMANCE   The driver for a CDatabase::OpenEx or CDatabase::Open call does not conform to required ODBC API Conformance level 1 (SQL_OAC_LEVEL1).
  • AFX_SQL_ERROR_CONNECT_FAIL   Connection to the data source failed. You passed a NULL CDatabase pointer to your recordset constructor and the subsequent attempt to create a connection based on GetDefaultConnect failed.
  • AFX_SQL_ERROR_DATA_TRUNCATED   You requested more data than you have provided storage for. For information on increasing the provided data storage for CString or CByteArray data types, see the nMaxLength argument for RFX_Text and RFX_Binary under "Macros and Globals."
  • AFX_SQL_ERROR_DYNASET_NOT_SUPPORTED   A call to CRecordset::Open requesting a dynaset failed. Dynasets are not supported by the driver.
  • AFX_SQL_ERROR_EMPTY_COLUMN_LIST   You attempted to open a table (or what you gave could not be identified as a procedure call or SELECT statement) but there are no columns identified in record field exchange (RFX) function calls in your DoFieldExchange override.
  • AFX_SQL_ERROR_FIELD_SCHEMA_MISMATCH   The type of an RFX function in your DoFieldExchange override is not compatible with the column data type in the recordset.
  • AFX_SQL_ERROR_ILLEGAL_MODE   You called CRecordset::Update without previously calling CRecordset::AddNew or CRecordset::Edit.
  • AFX_SQL_ERROR_LOCK_MODE_NOT_SUPPORTED   Your request to lock records for update could not be fulfilled because your ODBC driver does not support locking.
  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED   You called CRecordset::Update or Delete for a table with no unique key and changed multiple records.
  • AFX_SQL_ERROR_NO_CURRENT_RECORD   You attempted to edit or delete a previously deleted record. You must scroll to a new current record after a deletion.
  • AFX_SQL_ERROR_NO_POSITIONED_UPDATES   Your request for a dynaset could not be fulfilled because your ODBC driver does not support positioned updates.
  • AFX_SQL_ERROR_NO_ROWS_AFFECTED   You called CRecordset::Update or Delete, but when the operation began the record could no longer be found.
  • AFX_SQL_ERROR_ODBC_LOAD_FAILED   An attempt to load the ODBC.DLL failed; Windows could not find or could not load this DLL. This error is fatal.
  • AFX_SQL_ERROR_ODBC_V2_REQUIRED   Your request for a dynaset could not be fulfilled because a Level 2-compliant ODBC driver is required.
  • AFX_SQL_ERROR_RECORDSET_FORWARD_ONLY   An attempt to scroll did not succeed because the data source does not support backward scrolling.
  • AFX_SQL_ERROR_SNAPSHOT_NOT_SUPPORTED   A call to CRecordset::Open requesting a snapshot failed. Snapshots are not supported by the driver. (This should only occur when the ODBC cursor library — ODBCCURS.DLL — is not present.)
  • AFX_SQL_ERROR_SQL_CONFORMANCE   The driver for a CDatabase::OpenEx or CDatabase::Open call does not conform to the required ODBC SQL Conformance level of "Minimum" (SQL_OSC_MINIMUM).
  • AFX_SQL_ERROR_SQL_NO_TOTAL   The ODBC driver was unable to specify the total size of a CLongBinary data value. The operation probably failed because a global memory block could not be preallocated.
  • AFX_SQL_ERROR_RECORDSET_READONLY   You attempted to update a read-only recordset, or the data source is read-only. No update operations can be performed with the recordset or the CDatabase object it is associated with.
  • SQL_ERROR   Function failed. The error message returned by the ODBC function SQLError is stored in the m_strError data member.
  • SQL_INVALID_HANDLE   Function failed due to an invalid environment handle, connection handle, or statement handle. This indicates a programming error. No additional information is available from the ODBC function SQLError.

The SQL-prefixed codes are defined by ODBC. The AFX-prefixed codes are defined in AFXDB.H, found in MFC\INCLUDE.

신고
블로그 이미지

Moonistar moonistar