SlideShare una empresa de Scribd logo
1 de 9
01. 에러 핸들링
제프리 리처의 Windows VIA C/C++
2022.01.04 함송연
1. 자신만의 에러 코드를 정의하는 방법
2. ErrorShow 예제 애플리케이션
1
윈도우 함수의 반환 타입
자료형 실패했을 때의 값
VOID 이 함수는 절대 실패 하지 않는다.
BOOL 성공시 0이 아닌 값, 실패하면 0
(주의 : 성공시 0이 아닌 값이기에 TRUE(1)과 비교하지 말자)
HANDLE 성공시 유효한 핸들,
실패하면 0(NULL) or (INVALID_HANDLE_VALUE)
실패의 경우가 나뉘므로 SDK를 참조하여 프로그래밍을 하자.
PVOID 성공시 데이터를 저장하고 있는 메모리 주소를 반환,
실패시 NULL반환
LONG/DWORD HANDLE과 마찬가지로 실패의 경우가 각 함수마다 다르므로 SDK를 참조하여 프로그래밍을 하자.
2
에러 코드
DWORD GetLastError()
호출 함수가 실패하면 함수를 호출한 스레드의 스레드 지역 저장소에 적절한 에러 코드를 저장해 둔다.
GetLastError()를 통해 에러 코드를 읽어올 수 있다.
3
WinError.h (훨씬 많음)
메시지 내용 #define 값
Messageld : ERROR SUCCESS
MessageText :The operation completed successfully.
ERROR_SUCCESS 0L
NO_ERROR 0L
SEC_E_OK ((HRESULT)OxOOOOOOOOL)
Messageld: ERROR INVALID FUNCTION
MessageText: Incorrect function.
ERROR_INVALID_FUNCTION 1L
Messageld: ERROR FILE NOT FOUND
MessageText: The system cannot find the file specified.
ERROR_FILE_NOT_FOUND 2L
MessageId: ERROR PATH NOT FOUND
MessageText: The system cannot find the path specified.
ERROR_PATH_NOT_FOUND 3L
MessageId: ERROR_TOO_MANY_OPEN_FILES
MessageText: The system cannot open the file
ERROR_TOO_MANY_OPEN_FILES 4L
MessageId: ERROR ACCESS DENIED
MessageText: Access is denied.
ERROR_ACCESS_DENIED 5L
Visual Studio에서 에러 코드 확인
조사식
4
Error Loockup (도구 > 오류 조회)
조사식 > $err,hr 추가 (hr : 메세지를 함께 표시)
값을 통해 오류 메시지를 조회할 수 있다.
자신만의 에러 코드를 정의하는 방법
VOID SetLastError (DWORD dwErrCode);
5
에러 코드를 남기는 함수. 이때 DWORD로 자신만의 에러 타입을 만들어두고 남기면 된다.
각 필드가 의미하는 바는 24장 “예외 처리기와 소프트웨어 예외”에서 상세히 다룰 예정.
비트 31-30 29 28 27-16 15-0
내용 심각도 마이크로소프트/고객 예약됨 식별 코드 예외 코드
의미 0 = 성공
1= 정보
2= 주의
3= 에러
0 = MS
1 = 고객이 정의한 코드
항상 0 256까지는 MS 예약,
신규로는 257~4096 사용
MS나 고객이 정의한
코드
에러 코드 필드
Error Show 예제
개요
6
에러 코드를 입력하면 에러 메시지를 출력하는 다이얼로그 박스 프로그램. (VS의 Error Lookup과 동일한 기능)
다운로드
에러 코드를 입력하면 에러 메시지를 출력하는 다이얼로그 박스 프로그램. (VS의 Error Lookup과 동일한 기능)
한빛미디어 자료실 : https://www.hanbit.co.kr/support/supplement_list.html
(책 이름 검색하여 예제 소스 다운로드)
cggos/windows_via_cpp: Source Code of the Book "Windows Via C/C++" By Jeffrey Richter And Christopher Nasarre (github.com)
깃허브
Error Show 예제
39 line. Dlg_OnCommand 함수
7
windows_via_cpp/ErrorShow.cpp at master · cggos/windows_via_cpp (github.com)
FormatMessage
// Get the error code's textual description
BOOL fOk = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dwError, systemLocale,
(PTSTR) &hlocal, 0, NULL);
첫번째 매개변수 : 플래그
FORMAT_MESSAGE_FROM_SYSTEM : 운영체제가 정의하고 있는 에러 코드와 대응되는 메시지 텍스트를 얻고 싶음
FORMAT_MESSAGE_ALLOCATE_BUFFER : 에러 메시지 텍스트를 저장할 수 있는 충분한 메모리 공간을 할당해 줄 것을 요청,
할당된 메모리 블록을 가리키는 핸들은 hlocal 변수를 통해 반환
FORMAT_MESSAGE_IGNORE_INSERTS : 메세지 텍스트에 %로 시작하는 자리 표시자를 실질적인 값으로 변경하지 않을 것을 지정.
이 플래그를 인자로 전달하지 않으려면 반드시 자리 표시자에 나타날 정보를 Arguments 매개변수를 통해 전달해야 한다.
(마지막 인자 NULL로 된 부분)
하지만 예제의 경우 메시지 텍스트의 내용이 무엇인지를 미리 알 수 없어 Arguments 매개변수를 활용할 수 없다.
세 번째 매개변수 : 에러 코드
네 번째 매개변수 : 언어 식별자
(0이라면 시스템 기본 언어 설정. 어떤 언어의 운영체제가 설치되어 있는지를 미리 알 수 없다면 이 값을 특정 언어를 지정하도록 하드코딩 해서는 안된다.)
Error Show 예제
39 line. Dlg_OnCommand 함수
8
windows_via_cpp/ErrorShow.cpp at master · cggos/windows_via_cpp (github.com)
FormatMessage
// Get the error code's textual description
BOOL fOk = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dwError, systemLocale,
(PTSTR) &hlocal, 0, NULL);
FormatMessage가 성공하면 :
메세지를 담은 메모리 블록(hlocal)을 이용하여 스크롤 가능 창에 메세지를 출력
FormatMessage가 실패하면 :
에러 코드가 네트워크 에러와 관련되어 있는지 확인하기 위해 NetMsg.dll로부터 에러 코드를 다시 찾아보기 위해 NetMsg.dll 모듈의 핸들을 이용하여 FormatMessage를 재
호출
(20장 “DLL의 고급 기법”)
이와 같이 각각의 DLL(혹은 .exe)은 자신만의 에러 코드와 메시지 텍스트를 포함할 수 있다.
이러한 정보들은 메시지 컴파일러(MC.exe)를 통해 특정 모듈에 리소스 형태로 추가된다.
이러한 이유로 Visual Studio의 Error Lookup 유틸리티는 모듈 다이얼로그 박스를 이용하여 모듈을 추가하는 방법을 제공하고 있다.
9
끝

Más contenido relacionado

Similar a 01 에러핸들링(함송연)

카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션codercay
 
[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍NAVER D2
 
Mbed cli install guide
Mbed cli install guideMbed cli install guide
Mbed cli install guideByoungHern Kim
 
테스트가 뭐예요?
테스트가 뭐예요?테스트가 뭐예요?
테스트가 뭐예요?Kyoung Up Jung
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계Leonardo YongUk Kim
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 APINAVER Engineering
 
포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전주항 박
 
Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713Yong Joon Moon
 
Windows Debugging Technique #2
Windows Debugging Technique #2Windows Debugging Technique #2
Windows Debugging Technique #2Wooseok Seo
 
윈도우 커널 익스플로잇
윈도우 커널 익스플로잇윈도우 커널 익스플로잇
윈도우 커널 익스플로잇Seungyong Lee
 
100828 [visual studio camp #1] C++0x와 Windows7
100828 [visual studio camp #1] C++0x와 Windows7100828 [visual studio camp #1] C++0x와 Windows7
100828 [visual studio camp #1] C++0x와 Windows7sung ki choi
 
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018Kenneth Ceyer
 
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기우영 주
 
C#강좌
C#강좌C#강좌
C#강좌e12g
 
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)Sang Don Kim
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법성훈 김
 

Similar a 01 에러핸들링(함송연) (20)

카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션
 
[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍
 
Mbed cli install guide
Mbed cli install guideMbed cli install guide
Mbed cli install guide
 
테스트가 뭐예요?
테스트가 뭐예요?테스트가 뭐예요?
테스트가 뭐예요?
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
 
포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전
 
Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713
 
Windows Debugging Technique #2
Windows Debugging Technique #2Windows Debugging Technique #2
Windows Debugging Technique #2
 
윈도우 커널 익스플로잇
윈도우 커널 익스플로잇윈도우 커널 익스플로잇
윈도우 커널 익스플로잇
 
팀장 잔소리
팀장 잔소리팀장 잔소리
팀장 잔소리
 
100828 [visual studio camp #1] C++0x와 Windows7
100828 [visual studio camp #1] C++0x와 Windows7100828 [visual studio camp #1] C++0x와 Windows7
100828 [visual studio camp #1] C++0x와 Windows7
 
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
 
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
 
C#강좌
C#강좌C#강좌
C#강좌
 
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법
 

01 에러핸들링(함송연)

  • 1. 01. 에러 핸들링 제프리 리처의 Windows VIA C/C++ 2022.01.04 함송연 1. 자신만의 에러 코드를 정의하는 방법 2. ErrorShow 예제 애플리케이션 1
  • 2. 윈도우 함수의 반환 타입 자료형 실패했을 때의 값 VOID 이 함수는 절대 실패 하지 않는다. BOOL 성공시 0이 아닌 값, 실패하면 0 (주의 : 성공시 0이 아닌 값이기에 TRUE(1)과 비교하지 말자) HANDLE 성공시 유효한 핸들, 실패하면 0(NULL) or (INVALID_HANDLE_VALUE) 실패의 경우가 나뉘므로 SDK를 참조하여 프로그래밍을 하자. PVOID 성공시 데이터를 저장하고 있는 메모리 주소를 반환, 실패시 NULL반환 LONG/DWORD HANDLE과 마찬가지로 실패의 경우가 각 함수마다 다르므로 SDK를 참조하여 프로그래밍을 하자. 2
  • 3. 에러 코드 DWORD GetLastError() 호출 함수가 실패하면 함수를 호출한 스레드의 스레드 지역 저장소에 적절한 에러 코드를 저장해 둔다. GetLastError()를 통해 에러 코드를 읽어올 수 있다. 3 WinError.h (훨씬 많음) 메시지 내용 #define 값 Messageld : ERROR SUCCESS MessageText :The operation completed successfully. ERROR_SUCCESS 0L NO_ERROR 0L SEC_E_OK ((HRESULT)OxOOOOOOOOL) Messageld: ERROR INVALID FUNCTION MessageText: Incorrect function. ERROR_INVALID_FUNCTION 1L Messageld: ERROR FILE NOT FOUND MessageText: The system cannot find the file specified. ERROR_FILE_NOT_FOUND 2L MessageId: ERROR PATH NOT FOUND MessageText: The system cannot find the path specified. ERROR_PATH_NOT_FOUND 3L MessageId: ERROR_TOO_MANY_OPEN_FILES MessageText: The system cannot open the file ERROR_TOO_MANY_OPEN_FILES 4L MessageId: ERROR ACCESS DENIED MessageText: Access is denied. ERROR_ACCESS_DENIED 5L
  • 4. Visual Studio에서 에러 코드 확인 조사식 4 Error Loockup (도구 > 오류 조회) 조사식 > $err,hr 추가 (hr : 메세지를 함께 표시) 값을 통해 오류 메시지를 조회할 수 있다.
  • 5. 자신만의 에러 코드를 정의하는 방법 VOID SetLastError (DWORD dwErrCode); 5 에러 코드를 남기는 함수. 이때 DWORD로 자신만의 에러 타입을 만들어두고 남기면 된다. 각 필드가 의미하는 바는 24장 “예외 처리기와 소프트웨어 예외”에서 상세히 다룰 예정. 비트 31-30 29 28 27-16 15-0 내용 심각도 마이크로소프트/고객 예약됨 식별 코드 예외 코드 의미 0 = 성공 1= 정보 2= 주의 3= 에러 0 = MS 1 = 고객이 정의한 코드 항상 0 256까지는 MS 예약, 신규로는 257~4096 사용 MS나 고객이 정의한 코드 에러 코드 필드
  • 6. Error Show 예제 개요 6 에러 코드를 입력하면 에러 메시지를 출력하는 다이얼로그 박스 프로그램. (VS의 Error Lookup과 동일한 기능) 다운로드 에러 코드를 입력하면 에러 메시지를 출력하는 다이얼로그 박스 프로그램. (VS의 Error Lookup과 동일한 기능) 한빛미디어 자료실 : https://www.hanbit.co.kr/support/supplement_list.html (책 이름 검색하여 예제 소스 다운로드) cggos/windows_via_cpp: Source Code of the Book "Windows Via C/C++" By Jeffrey Richter And Christopher Nasarre (github.com) 깃허브
  • 7. Error Show 예제 39 line. Dlg_OnCommand 함수 7 windows_via_cpp/ErrorShow.cpp at master · cggos/windows_via_cpp (github.com) FormatMessage // Get the error code's textual description BOOL fOk = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError, systemLocale, (PTSTR) &hlocal, 0, NULL); 첫번째 매개변수 : 플래그 FORMAT_MESSAGE_FROM_SYSTEM : 운영체제가 정의하고 있는 에러 코드와 대응되는 메시지 텍스트를 얻고 싶음 FORMAT_MESSAGE_ALLOCATE_BUFFER : 에러 메시지 텍스트를 저장할 수 있는 충분한 메모리 공간을 할당해 줄 것을 요청, 할당된 메모리 블록을 가리키는 핸들은 hlocal 변수를 통해 반환 FORMAT_MESSAGE_IGNORE_INSERTS : 메세지 텍스트에 %로 시작하는 자리 표시자를 실질적인 값으로 변경하지 않을 것을 지정. 이 플래그를 인자로 전달하지 않으려면 반드시 자리 표시자에 나타날 정보를 Arguments 매개변수를 통해 전달해야 한다. (마지막 인자 NULL로 된 부분) 하지만 예제의 경우 메시지 텍스트의 내용이 무엇인지를 미리 알 수 없어 Arguments 매개변수를 활용할 수 없다. 세 번째 매개변수 : 에러 코드 네 번째 매개변수 : 언어 식별자 (0이라면 시스템 기본 언어 설정. 어떤 언어의 운영체제가 설치되어 있는지를 미리 알 수 없다면 이 값을 특정 언어를 지정하도록 하드코딩 해서는 안된다.)
  • 8. Error Show 예제 39 line. Dlg_OnCommand 함수 8 windows_via_cpp/ErrorShow.cpp at master · cggos/windows_via_cpp (github.com) FormatMessage // Get the error code's textual description BOOL fOk = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError, systemLocale, (PTSTR) &hlocal, 0, NULL); FormatMessage가 성공하면 : 메세지를 담은 메모리 블록(hlocal)을 이용하여 스크롤 가능 창에 메세지를 출력 FormatMessage가 실패하면 : 에러 코드가 네트워크 에러와 관련되어 있는지 확인하기 위해 NetMsg.dll로부터 에러 코드를 다시 찾아보기 위해 NetMsg.dll 모듈의 핸들을 이용하여 FormatMessage를 재 호출 (20장 “DLL의 고급 기법”) 이와 같이 각각의 DLL(혹은 .exe)은 자신만의 에러 코드와 메시지 텍스트를 포함할 수 있다. 이러한 정보들은 메시지 컴파일러(MC.exe)를 통해 특정 모듈에 리소스 형태로 추가된다. 이러한 이유로 Visual Studio의 Error Lookup 유틸리티는 모듈 다이얼로그 박스를 이용하여 모듈을 추가하는 방법을 제공하고 있다.