예기치 않은 Exception 발생시 처리를 하는 함수를 등록하는 방법이 있는지 궁금합니다.

again4you의 이미지

안녕하세요.
우선 제 궁금증에 관심을 가져주셔서 감사합니다.

제 궁금증은 개발자가 고려하지 않은,
그래서 try~catch 구문으로 작성하지 않은 부분에서
Exception이 발생하는 경우를 처리하기 위한
Function을 등록하는 방법이 있는지 궁금합니다.

이러한 방법이 있다면 Error를 발생시킨 파일, 함수, 라인수를 기록하고
그 당시의 Call Stack 값, Register 값을 기록하는 Dump 파일을 작성하여
사용자에게 배포된 후에라도 Error 상황에 대해서 쉽게 알 수 있을 것 같습니다.

Windows 계열에서는 OS에서 지원하는
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);

다음과 같은 함수를 지원하여
catch에서 처리하지 않는 Error 발생시
설정한 Callback 함수로 분기되어 개발자가 원하는 작업을 할 수 있습니다.

Linux에서도 커널에서 지원하는 함수 중에
위와 동일하거나 비슷한 역할을 하는 함수가 존재할 것이라 생각하는데,
알고 계시면 답변 부탁드립니다.
혹은 위와 유사한 문제에 대해서 해결방법을 말씀해 주셔도 고맙습니다.

그럼 오늘도 즐거운 하루 보내시고
환절기에 감기 조심하세요

감사합니다.

cdecl의 이미지

http://kldp.org/node/61634

set_terminate함수를 사용하여 terminate_handler를 교체하시면 될것 같습니다.

Header: <exception>
set_terminate :
Establishes a new terminate_handler to be called at the termination of the program.

--
cdecl

--
cdecl

again4you의 이미지

답변주신 내용을 바탕으로 다음과 같이 작성해 보고 결과를 확인하였습니다.

우선 Windows 환경과 Linux 환경에서 모두 수행하였는데,
제가 원하는 결과는 나오지 않았습니다.

아래의 예제는 'Devide by Zero'가 발생하는 경울
이런 경우 저는 제가 등록한 Exception Handler가 호출되기를 기대했었는데,
windows, linux 각각
비정상적인 종료, '부동 소수점 예외'가 발생하였습니다.

혹시 제가 원하는 결과를 도출할 수 있는 방법이 없을까요??
그럼 답변 기다리겠습니다.

즐거운 하루 보내세요

#include<exception>
#include<iostream>
 
using namespace std;
 
void unfunction( ) 
{
   cout << "unfunction()" << endl;
   terminate( );
}
 
void termfunction( ) 
{
   cout << "termfunction()" << endl;
   abort( );
}
 
 
int main( ) 
{
   unexpected_handler oldHand = set_unexpected( unfunction );
   terminate_handler oldHand2 = set_terminate(termfunction);
 
   //unexpected( );
   int b = 0;
   int a = 10/b;
}
lifthrasiir의 이미지

SIGFPE에 대해 찾아 보세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.