[C#] try / catch + 사용하여 올바른 구문

어느 것:

using (var myObject = new MyClass())
{
   try
   {
      // something here...
   }
   catch(Exception ex)
   {
      // Handle exception
   }
}

또는

try
{
   using (var myObject = new MyClass())
   {
      // something here...
   }
}
catch(Exception ex)
{
   // Handle exception
}



답변

나는 두 번째를 선호합니다. 객체 생성과 관련된 오류도 잡을 수 있습니다.


답변

using 블록은 try / finally ( MSDN ) 의 구문 단순화 일 뿐이므로 개인적으로 다음을 수행 할 것입니다.하지만 두 번째 옵션과는 크게 다릅니다.

MyClass myObject = null;
try {
  myObject = new MyClass();
  //important stuff
} catch (Exception ex) {
  //handle exception
} finally {
  if(myObject is IDisposable) myObject.Dispose();
}


답변

때에 따라 다르지. WCF (Windows Communication Foundation)를 사용하는 using(...) { try... }경우 프록시 입력 using문이 예외 상태 인 경우 (예 :이 프록시를 삭제하면 다른 예외가 발생 함) 제대로 작동하지 않습니다 .

개인적으로, 나는 최소한의 처리 방법, 즉 실행 시점에서 알고있는 예외 만 처리한다고 생각합니다. 즉, 변수 초기화에 using특정 예외 가 발생할 수 있음을 알고 있다면로 감싸 야합니다 try-catch. 마찬가지로, using신체 내부 에서의 변수와 직접 관련이없는 무언가가 발생할 수있는 경우 특정 예외를 위해 using다른 변수로 래핑합니다 try. 나는 Exceptioncatches 에서 거의 사용하지 않습니다 .

그러나 나는 좋아한다 IDisposable그리고 using그렇게하지만 어쩌면 편견.


답변

catch 문이 using 문에 선언 된 변수에 액세스해야하는 경우 내부 옵션이 유일한 옵션입니다.

catch 문에서 사용하기 전에 참조 된 객체가 필요하면 내부 옵션이 유일한 옵션입니다.

catch 문이 사용자에게 메시지를 표시하는 것과 같이 알 수없는 기간 동안 작업을 수행하고 그 전에 리소스를 폐기하려면 외부 옵션이 가장 좋습니다.

이와 비슷한 scenerio가있을 때마다 try-catch 블록은 일반적으로 사용보다 콜 스택보다 다른 방법입니다. 메소드가 이와 같이 발생하는 예외를 처리하는 방법을 아는 것은 일반적이지 않습니다.

그래서 나의 일반적인 추천은 바깥에 있습니다.

private void saveButton_Click(object sender, EventArgs args)
{
    try
    {
        SaveFile(myFile); // The using statement will appear somewhere in here.
    }
    catch (IOException ex)
    {
        MessageBox.Show(ex.Message);
    }
}


답변

둘 다 유효한 구문입니다. 실제로 원하는 작업을 수행합니다. 개체 생성 / 배치와 관련된 오류를 잡으려면 두 번째를 사용하십시오. 그렇지 않은 경우 첫 번째를 사용하십시오.


답변

여기서 중요한 것은 한 가지가 있습니다. 첫 번째 는 생성자 를 호출하여 발생하는 예외를 포착하지 않습니다MyClass .


답변

C # 8.0부터는 두 번째 것과 같은 것을 선호합니다

public class Person : IDisposable
{
    public Person()
    {
        int a = 0;
        int b = Id / a;
    }
    public int Id { get; set; }

    public void Dispose()
    {
    }
}

그리고

static void Main(string[] args)
    {

        try
        {
            using var person = new Person();
        }
        catch (Exception ex) when
        (ex.TargetSite.DeclaringType.Name == nameof(Person) &&
        ex.TargetSite.MemberType == System.Reflection.MemberTypes.Constructor)
        {
            Debug.Write("Error Constructor Person");
        }
        catch (Exception ex) when
       (ex.TargetSite.DeclaringType.Name == nameof(Person) &&
       ex.TargetSite.MemberType != System.Reflection.MemberTypes.Constructor)
        {
            Debug.Write("Error Person");
        }
        catch (Exception ex)
        {
            Debug.Write(ex.Message);
        }
        finally
        {
            Debug.Write("finally");
        }
    }