블로그는 귀차니즘

First Sensation
  • 공지
  • 지역로그
  • 태그
  • 방명록

C# Application - Main 에서 Try-Catch 오작동 해결하는 방법

Language 2008/04/07 20:49 귀차니스트
  오늘 정말 희한한 현상을 겪게 되었습니다. 그게 뭐냐하면 바로 C#의 Main단에서 Try-Catch 구문을 걸었는데 제대로 Catch가 걸리지 않았던 것이죠. 그 때는 참 황당했습니다. 왜냐구요? Visual Studio.Net을 C++개발자 타입으로 설정하였을 때, 디버그 모드로 프로세스를 실행하면 Catch까지 잘 걸리는데, 단독 프로세스로 실행했을 경우엔 Catch에 제대로 걸리지 않더군요. Application.Run 내부적으로 처리하는 것 같았습니다.

Program.cs (Language : csharp)
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Windows.Forms;
  5.  
  6. namespace WindowsFormsApplication3
  7. {
  8.     static class Program
  9.     {
  10.         /// <summary>
  11.         /// The main entry point for the application.
  12.         /// </summary>
  13.         [STAThread]
  14.         static void Main()
  15.         {
  16.             try
  17.             {
  18.                 Application.EnableVisualStyles();
  19.                 Application.SetCompatibleTextRenderingDefault(false);
  20.                 Application.Run(new Form1());
  21.             }
  22.             catch
  23.             {
  24.                 MessageBox.Show("테스트 Catch");
  25.             }
  26.         }
  27.     }
  28. }
  29.  

Form1.cs (Language : csharp)
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace WindowsFormsApplication3
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.         public Form1()
  15.         {
  16.             InitializeComponent();
  17.         }
  18.  
  19.         private void button1_Click(object sender, EventArgs e)
  20.         {
  21.             string aa = null;
  22.             aa.Substring(0);
  23.         }
  24.     }
  25. }
  26.  

  코드는 대충 위와 같았습니다. Program.cs 에서 Application.Run으로 폼을 표시하고 내부적으로 메시지 펌핑(?)을 하게 될거라 생각을 한 후, Form1에서는 고의적으로 익셉션을 발생시키게 하였습니다. 여기서 바로 문제가 발생합니다. 어떤 거냐구요? Debug 모드로 실행을 한 번 해보시고, 단독 모드로 실행을 한 번 해보십시오. 단독으로 실행을 하면 C#의 기본 Exception MessageBox(?)가 뜰거에요. 절대 메시지 박스가 뜨지 않습니다.
  그래서 결국 구글링을 하다가 찾게 된 페이지에서 하나의 해결책을 발견하고 적용시켜보니 제대로 작동이 되었습니다.

http://www.neowin.net/forum/lofiversion/index.php/t619252.html

  찾은 코드를 한 번 적용 시켜 보겠습니다. 그럼 Program.cs에 존재하는 코드에 한 줄이 추가됩니다.

Program.cs (Language : csharp)
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Windows.Forms;
  5.  
  6. namespace WindowsFormsApplication3
  7. {
  8.     static class Program
  9.     {
  10.         /// <summary>
  11.         /// The main entry point for the application.
  12.         /// </summary>
  13.         [STAThread]
  14.         static void Main()
  15.         {
  16.             try
  17.             {
  18.                 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
  19.                 Application.EnableVisualStyles();
  20.                 Application.SetCompatibleTextRenderingDefault(false);
  21.                 Application.Run(new Form1());
  22.             }
  23.             catch
  24.             {
  25.                 MessageBox.Show("테스트 Catch");
  26.             }
  27.         }
  28.     }
  29. }
  30.  

  Application.SetUnhandledExceptionMode를 ThrowException으로 설정하도록 하니 단독 모드에서도 테스트 Catch 메시지 박스 코드가 존재하는 Catch가 걸립니다. 아마도 추측하기론 Run 내부에서 Try-Catch를 설정하는 듯도 보이는 군요. 30분 정도 이 것때문에 삽질을 하긴 했지만 다음에 이런 일이 발생했을 때는 아주 유용할 것이라 생각합니다.^^
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Language" 분류의 다른 글

boost::spirit - Parser 라이브러리 (0)2008/04/23
std::ostreambuf_iterator, std::istreambuf_iterator의 이유 (1)2008/04/16
std::auto_ptr - Smart Pointer 이지만?? (1)2008/04/13
Boost 1.35 - 워크샵 뒤의 포스팅 (2)2008/04/03
C# Generics - Generics 문법의 사용법 (0)2008/03/21
2008/04/07 20:49 2008/04/07 20:49
TAG Application.Run, C#, Catch, Try, 예외
받은 트랙백이 없고, 댓글 7개가 달렸습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/46

댓글을 달아 주세요

  1. kkamagui 2008/04/09 10:24  댓글주소  수정/삭제  댓글쓰기

    오~ 꽤나 괜찮은 정보네~ ;)

    블로그의 질이 갈수록 높아지는구나 @0@)/~ 홧팅이다~

    • 귀차니스트 2008/04/09 22:56  댓글주소  수정/삭제

      헉 @0@.. 질이 높아지는것 같지는 않아용 ㄷㄷㄷ
      그래도 존내 올려야죵 ㅋㅋ

  2. 준호씨 2008/04/09 16:22  댓글주소  수정/삭제  댓글쓰기

    뭐냐뇽 ㅡ_ㅡ;
    오작동 미워요;

    • 귀차니스트 2008/04/09 22:56  댓글주소  수정/삭제

      ㅋㅋ 나도 몰라염 나도 미워용

  3. 준호씨 2009/11/23 14:53  댓글주소  수정/삭제  댓글쓰기

    C# 예외처리 찾다가 다시 오게 되는구만 ㅋ
    그나전 C# 쓰면 쓸수록 뭔가 이상하노 -_-; 내가 아직 적응을 못한건감...

    • 귀차니스트 2009/11/25 04:59  댓글주소  수정/삭제

      무엇이 말이삼??
      java 에서 checked-exception 인가??
      throw 로 지정하는거 그건 안되지 싶어 ㅋㅋ

      전체는 그냥 Exception 으로 받아서 하면 될거고..
      Exception을 Inherit 받아서 override 해줌 너만의 Exception 이 되지 않을까..

  4. 준호씨 2009/11/26 00:32  댓글주소  수정/삭제  댓글쓰기

    Java한참 쓰면서.. C#이 Java랑 비슷할거라 생각을 했었는데 여엉 이상하넹 -_-;
    예를 들어
    lblBankName.Text = (String)dr["bankname"];
    이런식으로.. Getter, Setter 도 잘 사용안하고 ToString() 이런거 안쓰고 (String)으로 type을 바꾼다거나 ["bankname"] 처럼 이상한 형식으로 배열을 사용한다거나 -_-; 암튼 구질구질 허구만...
    자바였다면
    lblBankName.SetText(dr.getString("bankname";)); 이런식으로 코딩 했겠지
    예외는 아직 많이 안써봐서 좀 더 써보고 평가 해 볼 수 있을듯 함.

◀ 이전페이지 1 다음페이지 ▶

블로그 이미지
First Sensation 귀차니스트
rss
  • 관리자
  • 글쓰기

카테고리

  • 전체 (119)
    • Computer (3)
    • Language (14)
    • Reverse Engineering (1)
    • Algorithm (10)
    • TopCoder (3)
    • Library (2)
    • Programming (21)
    • Programming Tip (9)
    • PSP-Programming (10)
    • Program (5)
    • Small Talk (33)
    • Document (4)
    • OS Develope (4)

최근에 올라온 글

  • Dovelet - (1).
  • Script Interpreter - b....
  • VirtualHttpServer - 가.... (2)
  • 음.. 여러가지 일이 있.... (2)
  • 어후.. 드디어 인터럽트....

최근에 달린 댓글

  • 좋은정보 감사합니다. :). 블루아사 03:05
  • 헠 ㅋ 다음에도 들러주세용 ㅋㅋ. 귀차니스트 03/09
  • ㅎㅎ RSS로 첨 온 글이네.ㅋ. 당구리 02/22
  • 음.. 한글화 파일 0.5 버젼은.... 귀차니스트 02/22
  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 01/30

달력

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

링크

  • kkamagui 프로그래밍 세상.
  • runner님의 이글루.
  • 당구리의 마굿간.
  • 동우fly.
  • 류광의 번역 이야기.
  • 서광열의 프로그래밍 언....
  • 준호씨의 블로그.
  • 최익필의 이름없는 블로그.
  • 위키는 귀차니즘.

최근에 받은 트랙백

  • 한게임 테트리스 인공지.... 고니's Life 2009
  • ACM 706 (Uva ID) : LCD.... 알고리즘 트레이닝 : Oh... 2009
  • 문제 4 : LCD 디스플레.... 최익필의 이름없는 블로그 2009
  • 궁극의 예외처리. 이름없는 블로그 2008
  • Maximum sum. 티스토리 지점 2008

글 보관함

  • 2010/03 (2)
  • 2010/02 (1)
  • 2010/01 (1)
  • 2009/12 (3)
  • 2009/08 (1)

태그목록

  • TShell
  • PSP
  • Programming
  • 디아블로3
  • XQuared
  • OS
  • 라이브러리
  • ATL
  • 뻘글
  • Develope
  • Code
  • Linefeed
  • Shell
  • GUI
  • boost::array
  • auto_ptr
  • boost::Tokenizer
  • 표준
  • Builder
  • System.Xml
  • ACM
  • 준비
  • Secure
  • i++
  • ostream_iterator
  • Xtream Toolkit Pro
  • boost
  • Raw
  • Directive
  • 디코딩

지역로그 : 태그 : 방명록 : 관리자 : 글쓰기
귀차니스트’s Blog is powered by Textcube 1.7.5 : Risoluto / Designed by DesignNia.net