문제
내 수업에 다음 코드가 있습니다.이 클래스의 목적은 웹 서버에서 잔액을 가져오는 것입니다.균형을 맞추는 데 문제가 있는 경우를 대비해.예외를 처리하겠습니다.그러나 이 모든 작업은 쉽습니다.하지만 catch 문에서 무엇을 반환해야 하는지 궁금합니다.
제가 살펴본 대부분의 예제는 다음을 사용하여 콘솔에 작성했습니다.
Console.WriteLine(ex.Message);
그것은 모두 아주 좋습니다.하지만 실제 애플리케이션에서 대부분의 개발자는 무엇을 합니까?
//Download only when the webclient is not busy.
if (!wc.IsBusy)
{
// Sleep for 1/2 second to give the server time to update the balance.
System.Threading.Thread.Sleep(500);
try
{
// Download the current balance.
wc.DownloadStringAsync(new Uri(strURL));
}
catch (WebException ex)
{
Console.Write("GetBalance(): " + ex.Message);
}
}
else
{
Console.Write("Busy please try again");
}
현재 내 기능은 무효를 반환합니다.그리고 웹 클라이언트가 바쁜 경우 무엇을 더 반환할지 궁금합니다.
어떤 조언이라도 감사드립니다.
해결책
처리할 수 없는 경우 예외를 포착하지 마세요. 일부 값만 반환하는 경우 호출 메서드는 값이 실제 결과인지 아니면 단지 예외 표시인지 확인해야 합니다.이제 이 메서드는 무엇을 수행하고 반환할지 결정해야 합니다.그리고 이 메서드를 호출하는 메서드입니다.그리고 방법은...
따라서 예외가 스택에 버블링되도록 하고 처리할 수 있는 곳에서 예외를 잡으세요.사용자 인터페이스 바로 아래에 사용자가 다시 시도할지 묻는 메시지 상자를 표시하거나 문제 해결 방법에 대한 정보를 표시할 수도 있습니다.사용자 인터페이스가 없다면 문제를 해결할 수 있는 곳에서 찾아 다시 시도하세요.일시적인 문제라면 호출이 성공할 때까지 합리적인 수준에서 전체 작업을 다시 시도하세요.
무언가를 기록하려면 다음 패턴을 사용하여 예외를 기록하고 다시 발생시키세요.
try
{
DoStuff();
}
catch (Exception exception)
{
Log(exception.ToString());
throw;
}
참고하세요 throw;
그리고는 아니다 throw exception;
.나중에 수행하면 원래 스택 추적이 손실됩니다.예외 원인에 대한 자세한 내용을 추론할 수 있는 경우 추가 정보를 사용하여 발견된 예외를 보다 의미 있는 예외로 래핑해야 합니다.
try
{
DoStuff();
}
catch (SpecificMeaninglessException exception)
{
Log(exception.ToString());
throw new MeaningfulException("Details about the error.", exception);
}
catch (Exception exception)
{
Log(exception.ToString());
throw;
}
다른 팁
ex.tostring () 메소드를 사용해야합니다
예외는 예외에 대한 간단한 설명을 포함합니다 (예 : "객체 참조가 설정되지 않습니다 ...").
Exception.toString ()에는 완전한 스택 트레이스와 함께 예외에 대한 설명이 포함되어 있습니다.
클라이언트가 바쁘지만 다시 시작하기 전에 특정 시간을 기다릴 수있는 방법을 다시 실행할 수 있습니까? 잠재적으로 X 재원 후 고장이 발생합니다.
대신 계속해서 문제를 기록하고 단순히 로그인하려면 Catch 문은 파일 기반 로그, 이벤트 뷰어, 데이터베이스에 제출하고 필요한 경우 경고 (이메일, SMS 등)에 예외를 기록 할 수 있습니다.
예외의 심각성에 따라 다릅니다.
나는 조사하는 것이 좋습니다 패턴 및 관행에서 예외 블록
예외를 보는 데만 관심이 있다면 예외를 다시 던져서 누가 처리 할 계획이라면 여전히 그것을 얻을 수 있습니다.
당신은 확실히 처리되지 않은 예외를 숨기고 싶지 않습니다. 스택을 통해 거품을 올리십시오. 그러나 웹 클라이언트가 바쁘다면 무엇을 반환 해야하는지 묻는 경우, 균형을 다시 다운로드하기 전에 임의의 간격 또는 기능 발신자가 기다려야하는 의미있는 간격을 반환하는 것은 어떻습니까? 임의의 숫자는 부하를 배포하거나 충돌 문제를 완화 할 수 있습니다. 더 의미있는 간격은 서버의 현재 상태에 따라 다시 전송 될 수 있습니다.