'Try'에 해당되는 글 1건

  1. 2008/04/07 귀차니스트 C# Application - Main 에서 Try-Catch 오작동 해결하는 방법 (7)

  오늘 정말 희한한 현상을 겪게 되었습니다. 그게 뭐냐하면 바로 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. namespace WindowsFormsApplication3
  6. {
  7.     static class Program
  8.     {
  9.         /// <summary>
  10.         /// The main entry point for the application.
  11.         /// </summary>
  12.         [STAThread]
  13.         static void Main()
  14.         {
  15.             try
  16.             {
  17.                 Application.EnableVisualStyles();
  18.                 Application.SetCompatibleTextRenderingDefault(false);
  19.                 Application.Run(new Form1());
  20.             }
  21.             catch
  22.             {
  23.                 MessageBox.Show("테스트 Catch");
  24.             }
  25.         }
  26.     }
  27. }

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. namespace WindowsFormsApplication3
  10. {
  11.     public partial class Form1 : Form
  12.     {
  13.         public Form1()
  14.         {
  15.             InitializeComponent();
  16.         }
  17.         private void button1_Click(object sender, EventArgs e)
  18.         {
  19.             string aa = null;
  20.             aa.Substring(0);
  21.         }
  22.     }
  23. }

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


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

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

  Application.SetUnhandledExceptionMode를 ThrowException으로 설정하도록 하니 단독 모드에서도 테스트 Catch 메시지 박스 코드가 존재하는 Catch가 걸립니다. 아마도 추측하기론 Run 내부에서 Try-Catch를 설정하는 듯도 보이는 군요. 30분 정도 이 것때문에 삽질을 하긴 했지만 다음에 이런 일이 발생했을 때는 아주 유용할 것이라 생각합니다.^^

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/04/07 20:49 2008/04/07 20:49

댓글을 달아 주세요

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

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

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

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

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

  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";)); 이런식으로 코딩 했겠지
    예외는 아직 많이 안써봐서 좀 더 써보고 평가 해 볼 수 있을듯 함.