DJ메탈짱™의 Free Style

[ASP.NET, C#] EMAB (Exception Management Application Block) 본문

일(job)/MS(Microsoft)

[ASP.NET, C#] EMAB (Exception Management Application Block)

뽀&쏭 2020. 12. 25. 16:14

애플리케이션에서 발생되는 예외를 처리하기위해 try .. catch를 하다보면 좀더 일반적인 방법과 통합된 그 무언가가 있지않을까 아쉬운 적이 다들 있으셨을겁니다.

 

오늘 소개하는 EMAB는 Microsoft 에서 patterns & practices 엔터프라이즈 라이브러리로 제공하고 있습니다.

 

장점은 예외 처리 기능을 별도로 하지않고 재상용이 가능하다는것과 인터페이스 기반으로 해서 쉽게 확장이 가능하다는데 있습니다.

- 변경에는 닫혀있고 확장에는 열려있습니다. ^^;

 

EMAB 다운로드

 

최신 버전은 patterns & practices Enterprise Library - June 2005 에서 제공되고 있지만 너무나 복잡한 관계로 예전버전 을 받아서 사용해보도록 하겠습니다.

설치하시면 소스와 문서 그리고 퀵샘플을 보실 수 있습니다.

 

EMAB.chm을 실행시켜 보면 방대한(?) 도움말이 나옵니다.

- 위 그림은 참고만 하시고 지금부터 하나하나 따라가보도록 하겠습니다.

 

초간단 EMABWinTest 프로젝트 만들어보기

 

1. c:\program files\microsoft application blocks for .net\exception management\code\cs\Exception Management Quick Start Samples (CS).sln 을 VS.NET 2003에서 엽니다.

2. ExceptionManagementQuickStartSamples은 처음에 보면 너무나 복잡해보여서 좌절하기 쉬우므로 나중에 보고 우선은 훨씬 더 간단한 예제를 만들어보겠습니다.

3. 새 프로젝트를 하나 추가합니다. 이름은 EmabWinTest로 하고 Windows 응용 프로그램을 선택

4. 참조추가 - 프로젝트에서 Microsoft.ApplicationBlocks.ExceptionManagement를 선택합니다.

5. 여기까지하면 EMAB를 쓸 수 있는 상태로 마무리된겁니다.

6. 타이핑수고를 덜기 위해 네임스페이스를 페이지 상단에 선언.

    using Microsoft.ApplicationBlocks.ExceptionManagement;

7. 버튼을 하나 폼에 붙이고 클릭 이벤트를 아래와 같이 만들어 봅니다.

  

private void button1_Click(object sender,System.EventArgs e)
{
  int x , y=0;
try
{
x = 5 / y;       
}
catch(Exception ex)
{
  ExceptionManager.Publish(ex);
}  
}

         

8. ExceptionManager의 Publish가 static이기 때문에 인스턴스를 따로 안만들고 바로 호출 가능합니다.

 

9. 이렇게 해서 실행시키면 이벤트 뷰어에 에러가 쌓여있는게 보입니다.

아주 아주 간단하게 적용이 됐네요. ^^

 

에러를 이벤트로그 대신 파일로 남기고 싶을때는...

 

1. 파일로그를 처리하는 Publisher를 만드셔야합니다.

2. 클래스 파일을 하나 추가하고 IExceptionPublisher 를 상속받습니다.

3. Publish 메소드를 구현해야하는데 아래와 같이 합니다.

 

 

using System;
using System.Text;
using System.IO;
using Microsoft.ApplicationBlocks.ExceptionManagement;
namespace EmabWinTest
{
 /// <summary>
 /// FileExceptionPublisher에 대한 요약 설명입니다.
 /// </summary>
 public class FileExceptionPublisher :IExceptionPublisher
 {
  public FileExceptionPublisher()
  {
   //
   // TODO: 여기에 생성자 논리를 추가합니다.
   //
  }
 #region IExceptionPublisher 멤버
public void Publish(Exception exception,
   System.Collections.Specialized.NameValueCollection additionalInfo,  
  System.Collections.Specialized.NameValueCollection configSettings)
  {
   StringBuilder sb = new StringBuilder();
  sb.Append("FATAL ERROR:" + Environment.NewLine);
   sb.Append(exception.Message);
   // Write the entry to the log file.       using ( FileStream fs = File.Open(@"c:\emabwinlog.txt",     FileMode.Create,FileAccess.ReadWrite))
   {      using (StreamWriter sw = new StreamWriter(fs))
    {
     sw.Write(sb.ToString());
    }
   }
  }  #endregion
 }
}

 

이제 Custom Publisher는 만들었으니 EMAB가 처리할 수 있도록 알려주는 작업이 필요합니다.

EMAB 소스를 전혀 수정하지 않고도 이 작업이 가능한데 방법은

 

4. 프로젝트에 응용 프로그램 구성 파일 추가. 이걸하면  app.config 파일 추가 됩니다.

5. 아래와 같이 수정

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration> <configSections>
<!-- EMAB 를 등록(?) --> <section name="exceptionManagement"   type="Microsoft.ApplicationBlocks.ExceptionManagement.ExceptionManagerSectionHandler,     Microsoft.ApplicationBlocks.ExceptionManagement" /> </configSections> <!-- EMAB를 활성화(on) 시키고 있으며 두개의 Publisher를 등록했습니다. --> <exceptionManagement mode="on">   <publisher assembly="Microsoft.ApplicationBlocks.ExceptionManagement"
  type="Microsoft.ApplicationBlocks.ExceptionManagement.DefaultPublisher"   
logname="MyCustomLog"  applicationname="My EMABTest App" />   <!-- 이 부분에 우리가 방금 만든 Custom Publisher를 등록하면 됩니다.       type은 어셈블리명.클래스명 -->  <publisher assembly="EmabWinTest"    type="EmabWinTest.FileExceptionPublisher" /> </exceptionManagement> </configuration>  

 

이렇게 한 뒤에 실행하면 C드라이드 루트에 emabwinlog.txt 파일에 로그가 쌓입니다.

 

뭐 이 정도 했으면 ExceptionManagementQuickStartSamples 예제도 슬슬 이해가 가시기 시작할겁니다.

 

ASP.NET에서는 어떻게?

 

윈폼이나 웹폼이나 별반 다를게 없습니다.

app.config = win.config

이 정도만 알면 뭐 그대로 쓰시면 됩니다.

 

단 권한 문제 (이벤트로그 접근 / 파일 쓰기) 때문에 web.config에 아래 줄을 추가해주시면 됩니다.

(이 방법 말고 또 다른 방법이 더 있는지는 모르겠음)

 

<system.web>...  <identity impersonate="true" userName="administrator" password="XXXXX" />   ... </system.web>

 

라고 설명이 되있는데 administrator 권한으로 가장하여 실행이 된다고 이해하면 되겠죠.

 

정리

 

1. 프로젝트에서 EMAB를 참조

  using Microsoft.ApplicationBlocks.ExceptionManagement;

   

2. 에러 처리 부분에서   ExceptionManager.Publish(ex) 를 호출

    catch(Exception ex) {       

ExceE

       ExceptionManager.Publish(ex);
   }  

 

3. 필요하다면 IExceptionPublisher 인터페이스를 구현하여 Custom Publisher를 구현하는 방식으로 확장시켜 나간다.