.NET General2008.03.30 22:39

최근에 현재 유지보수중인 솔루션의 에러 처리 로직 개선 작업을 하다가, 내가 아직도 Throw와 Throw ex의 차이를 모른다는 사실을 알게 되었다. -_-;; 그래서 구글신에게로 고고씽. ㅎ


역시 구글신께서 알려주신 Top 4개의 링크만으로 모든 궁금증이 풀렸다. 그 링크 목록은 다음과 같다.

Joteke's Blog - Difference: throw or throw ex?
Scott Dorman Blog - Difference between "throw" and "throw ex" in .NET
Mattness Encapsulated -  throw; vs. throw ex; Here's the difference!
BULLOG.NET - 즈믄의 C# 강좌 - throw  VS  throw ex


정리하자면..

  1. Throw는 이전 Exception의 모든 내용을 보존하지만, Throw ex는 보존하지 않는다. 따라서 단순히 이전에 발생한 예외를 전달만 한다면, Throw를 쓰는 것이 좋다.
  2. 새롭게 예외를 포장(?)한다면 - New ApplicationException등을 사용해서 - 이전 예외 객체를 innerException으로 같이 넘기는 것이 좋다.
신고
Posted by kkongchi
TAG .NET
C# & VB.NET2008.03.09 21:01
Tistory 태그: ,

메서드를 작성할 때에, Argument가 다 정상적으로 들어올거라고 가정해서는 절대로 안 된다. 반드시 다음과 같이 Validation 코드를 작성해서, 메서드의 가장 위에 둘 필요가 있다.


1. Argument 가 null인지 검사해서, null이라면 NullArgumentException을 던져야 한다. 아래 코드는 .NET Framework의 System.Windows.Annotations.Annotation 클래스의 WriteXml메서드의 가장 윗부분 코드이다.


public void WriteXml(XmlWriter writer)
{
   
if (writer == null)
   
{
       
throw new ArgumentNullException("writer");
   
}
}
 

2. 각 argument값 자체의 이상 유무를 검사한다.
기본적인 string 이라면, 전에 올렸던 글처럼 IsNullOrEmpty 메서드를 써서 검사하고, 다른 type이라면.. -_-;; 다양한 것을 다 여기서 다루기는 힘드므로.. 일단 적절하게 검사한다.  아래 예제는 위에서도 사용한 System.Windows.Annotations.Annotation 클래스의 WriteXml메서드의 일부분인데, 넘어온 XML의 내부 스트링들을 IsNullOrEmpty메서드로 검사해서, 없을 경우 채워넣는 코드이다.


  if (string.IsNullOrEmpty(writer.LookupPrefix("http://schemas.microsoft.com/windows/annotations/2003/11/core")))
   
{
       
writer.WriteAttributeString("xmlns", "anc", null, "http://schemas.microsoft.com/windows/annotations/2003/11/core");
   
}
   
if (string.IsNullOrEmpty(writer.LookupPrefix("http://schemas.microsoft.com/windows/annotations/2003/11/base")))
   
{
       
writer.WriteAttributeString("xmlns", "anb", null, "http://schemas.microsoft.com/windows/annotations/2003/11/base");
   
}
}
신고
Posted by kkongchi
코드분석 규칙2008.01.19 11:49
이 블로그에서도 간단하게나마 FxCop Custom 규칙을 만드는 방법을 "[HowTo]FxCOP(비주얼 스튜디오 2005 코드 분석) Custom 규칙 작성하기(C#)" 라는 제목으로 소개한 바 있었다. 내용이 너무 부실해서 민망하긴 해도, 아주 간단한 규칙 정도는 작성할 수 있는 수준의 글이었다.

오늘 MS의 Code Analysis Team Blog"Tutorial on writing your own Code Analysis rule" 이라는 글이 올라와서 봤더니, BinaryCoder.Net의 Jason Kresowaty라는 친구가 올린 "FxCop: Writing Your Own Custom Rules"이라는 글을 소개하는 포스팅이었다.

아직은 대충 봤는데, Introspection Object Model에 대해서 아주 자세하게 다루는 것이 눈에 띈다. Introspector라는 자기가 만든 유틸리티도 소개를 하고 있고. 찬찬이 읽어 봐야 겠다.

아래는 그 Instrospector라는 유틸리티의 스크린샷

사용자 삽입 이미지

신고
Posted by kkongchi
.NET General2007.04.25 19:44
현재 내가 근무하고 있는 회사는 BI 솔루션 업체이다. 그래서 이 솔루션이라고 하는 것이 현재 개발 중인 버전만 있는 것이 아니고, 기존에 고객들이 쓰던 예전 버전 또한 존재하기 때문에 기존 솔루션을 유지, 관리하는 일도 아주 중요한 업무 중의 하나이다.

얼마전에 이전 버전 중의 하나에서 이슈가 발견되어서, 처음으로 그 예전 버전을 디버깅할 일이 생겼다. 기존 버전은 Visual Studio.NET 2002를 가지고 개발되었기 때문에 VS.NET 2002 를 설치하고 웹 프로젝트를 열려고 하는데..
문제가 발생했다...

열리지 않는 것이다. 분명히 IIS에 제대로 경로를 잡아줬기 때문에 잘 열려야 하는데 안 열리는 것이었다. -_-;;

그리고 결국 Microsoft Support Sited에서 해결책을 찾았다.
Fix: You Cannot create web project on Windows server 2003 in Visual Studio.NET 2002

위 문서에서 제시하는 해결책은 다음과 같다.
1. Visual Studio 2003으로 개발한다
2. IIS 웹 사이트 속성에서 Mime Type에 확장자 tmp, 타입 text/plain 을 하나 추가한다. 비주얼 스튜디오 2002가 웹 프로젝트를 열기 전에 테스트할 목적으로 .tmp파일을 하나 생성해서 거기에 Request를 보내는데 IIS 6.0에서는 명시적으로 Mime Type에 추가시키지 않으면 블록을 해버린다고 한다. 나는 이 방법으로 해결했다.
3. 위 문서에 링크되어 있는 핫픽스를 설치한다.

아마도 나와 같은 특수한 경우가 아니라면 - 사실 나도 Windows 2003을 쓰고 있어서 그랬지만, 원래 우리 회사 솔루션의 예전 버전은 Windows 2000에 설치하는 것이 원칙이다 - 이런 문제를 만날 일이 없을 지도 모르겠다. 하지만 혹시라도 이런 일이 있다면, 참고하시길 바란다.
신고
Posted by kkongchi
디자인 규칙은 클래스 라이브러리 디자인 가이드라인에 따르는 지를 검사하는 규칙들의 모음이다. 닷넷의 기본적인 사상에 부합되는 클래스, 인터페이스, 예외 처리 등의 디자인이 되었는지(예:CA1020 형식이 부족한 네임스페이스를 사용하지 마십시오), .NET Class Library에서 적용된 기본적인 설계 원칙들을 따르고 있는 지(예: CA1056 Uri 속성은 문자열이면 안 됩니다), .NET Framework의 기본적인 규칙을 따로 있는지(예:CA2210 어셈블리에는 올바른 강력한 이름을 사용해야 합니다) 등을 검사하는 것이라고 할 수 있다.

디자인 규칙에는 아래와 같은 규칙들이 있다.

CA1000 정적 멤버를 제네릭 형식으로 선언하지 마십시오
CA1001 삭제 가능한 필드가 있는 형식은 삭제 가능해야 합니다.
CA1002 제네릭 목록을 노출하지 마십시오.
CA1003 제네릭 이벤트 처리기 인스턴스를 사용하십시오.
(추가 예정... 각 규칙을 클릭하면 규칙에 대한 포스트로 이동한다)
신고
Posted by kkongchi
C# & VB.NET2006.06.21 00:27

클래스를 참조하지 않은 상태에서, DLL로부터 동적으로 클래스를 로드해서 써야 경우가 있다. 그럴때는 .NET에서 제공하는 Reflection API사용해서 클래스를 로드하고 인스턴스화할 있다. 다음 코드와같이 사용하면 된다.

System.Reflection.Assembly assm =

System.Reflection.Assembly.LoadFile(@"D:\Assemblies\SomeAssembly.dll");

object obj = assm.CreateInstance("FullClassName");

신고
Posted by kkongchi

티스토리 툴바