"순수하게 문서화"목적으로 메서드에서 예외를 잡아서 메서드 자체 안에 오류 문서를 캡슐화하거나 호출자의 책임입니까?"순수하게 문서화하는"목적으로 내 메서드에서 예외를 잡아야합니까?
EncryptPackage()
메서드에서 여러 가지 예외를 throw 할 수있는 프레임 워크를 비롯하여 수많은 다른 메서드를 호출한다고 가정합니다. 나는 using
블럭의 모든 것을 덮어 쓴다. 그래서 클린업을위한 예외를 잡을 필요가 없다. (또는 나는 try/finally를 사용한다.) 어쨌든 예외를 catch해야하고 해당 메서드의 컨텍스트에 대한 세부 정보를 제공해야합니까? 아니면 호출자 메서드의 책임입니까? 하는과, 그냥 "오류 텍스트를 장식하는"하려면 EncryptPackage()
방법은 가능한 모든 예외를 잡는다 방법 텍스트를 "오류 패키지를 암호화하는 동안 발생했습니다"알
[Serializable]
class TestClassException : Exception
{
public TestClassException() : base() { }
public TestClassException(string message) : base(message) { }
public TestClassException(string message, Exception innerException) : base(message, innerException) { }
}
class TestClass
{
public TestClass() { }
public void EncryptPackage()
{
try
{
DoSomething();
DoAnotherThing();
}
catch (Exception ex)
{
throw new TestClassException("Error occurred during package encryption", ex);
}
}
}
class ConsumerExample
{
public ConsumerExample() { }
public void DoSomeStuff()
{
TestClass testClass = new TestClass();
try
{
testClass.EncryptPackage();
}
catch (TestClassException ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
}
}
}
이 코드에서 : 여기
는 경우입니다 . 여기서EncryptPackage()
은 오류 설명 논리를 캡슐화합니다. 여기
그리고
이 또 다른 기술이다. 호출자가 오류 패키지 암호화 동안 오류가 발생했습니다 "로 어쨌든 오류 사례를 문서화하기 때문에,이 예에서class TestClass2
{
public TestClass2() { }
public void EncryptPackage()
{
DoSomething();
DoAnotherThing();
}
}
class ConsumerExample2
{
public ConsumerExample2() { }
public void DoSomeStuff()
{
TestClass testClass = new TestClass();
try
{
testClass.EncryptPackage();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show("Error occurred during package encryption.\r\n\r\n" + ex.ToString());
}
}
}
, EncryptPackage()
아무것도 캐치하지 않았던 \ 연구 \ 없음 \ 연구 \ n "메시지.
이것은 매우 단순한 예이며 실제로는 수많은 계층 적 클래스가있을 것이고 예외는 긴 호출 스택을 통해 전파되므로 예외를 잡는 방법이 선호됩니까? 두 번째 접근법은 예외가 "실제 처리"(예 : 사용자에게 표시)가 수행되는 계층에서 처리되기 때문에 "보다 명확하게"보입니다. 호출 스택 정보는 예외 객체에 보존되므로 기술적으로 예외가 발생한 정확한 위치를 찾을 수 있습니다. 하지만 ... 각 접근 수준이 오류에 자체 설명을 추가하고 이전 예외가있는 innerException
멤버를 유지하는 첫 번째 접근 방식으로는 "잘 문서화 된"것으로 보이지 않습니다. 이 경우 실행시 TestClass
계층을 벗어나면 이미 내에 발생한 오류에 대한 자세한 설명이 포함되어 있습니다. 따라서 이것은 오류 처리 로직을보다 잘 캡슐화하는 것으로 느껴집니다.
어느 것을 사용할 것입니까?
사람들이 나를 도우려는 경우 이전 질문에 대한 답변을 더 받아야합니까? 예. – Cephalopod
'throw new TestClassException ("패키지 암호화 도중 오류가 발생했습니다", 예); 이것은 당신이 이미 해결할 수 없다는 것을 알려줍니까? –
@Arian, LOL 맞아, 종종 모든 대답을 검토하고 "우승자"를 선택하는 것을 잊어 버립니다. 죄송합니다. 내 모든 질문을 지금 검토하겠습니다. 상기시켜 줘서 고마워! –