다음을 통해 공유


클라이언트에서 오류 처리

이 항목에서는 클라이언트에서 데이터를 검색하거나 수정할 때 오류가 발생하는 경우 오류를 처리하고 특정 단계를 수행하는 일반적인 방법에 대해 설명합니다. WCF RIA Services를 사용하여 데이터 작업에 대한 콜백 메서드를 제공하고 이 콜백 메서드에서 오류를 확인하여 오류를 처리할 수 있습니다. 데이터 작업에 대한 호출이 비동기 호출이므로 예외가 비동기적으로 throw되기 때문에 콜백 메서드를 사용해야 합니다. 기본적으로 도메인 작업의 모든 오류에 대해 예외가 throw됩니다. RIA Services를 사용하여 오류를 처리하고 프레임워크에서 예외를 throw하지 않도록 지정할 수 있습니다.

데이터 로드 시 오류 처리

쿼리 메서드에서 데이터를 로드할 때 오류를 처리하거나 오류를 무시하도록 선택할 수 있습니다. 특히 다음 옵션 중에서 선택할 수 있습니다.

  • 콜백 메서드에 대한 매개 변수가 있는 Load 메서드를 사용합니다. 콜백 메서드에서 오류를 처리하고 MarkErrorAsHandled 메서드를 호출하여 예외가 throw되지 않도록 지정합니다.

  • throwOnError라는 boolean 매개 변수가 있는 Load 메서드를 사용합니다. 쿼리 오류에 대한 예외를 throw하지 않도록 지정하려면 Load 메서드를 호출할 때 throwOnErrorfalse로 설정합니다.

  • 콜백 메서드에 대한 매개 변수 또는 boolean 매개 변수가 없는 Load 메서드를 사용합니다. 쿼리를 실행할 때 오류가 발생하면 처리되지 않은 예외가 발생합니다.

다음 예제에서는 쿼리에서 데이터를 로드하고 로드 작업에서 오류를 확인하는 콜백 메서드를 지정하는 방법을 보여 줍니다.

Private _customerContext As New CustomerDomainContext

Public Sub New()
    InitializeComponent()

    Dim loadOp = Me._customerContext.Load(Me._customerContext.GetCustomersQuery(), AddressOf OnLoadCompleted, Nothing)
    CustomerGrid.ItemsSource = loadOp.Entities
End Sub

Private Sub OnLoadCompleted(ByVal lo As LoadOperation(Of Customer))
    If (lo.HasError) Then
        MessageBox.Show(String.Format("Retrieving data failed: {0}", lo.Error.Message))
        lo.MarkErrorAsHandled()
    End If
End Sub
private CustomerDomainContext _customerContext = new CustomerDomainContext();

public MainPage()
{
    InitializeComponent();

    LoadOperation<Customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersQuery(), OnLoadCompleted, null);
    CustomerGrid.ItemsSource = loadOp.Entities;
}

private void OnLoadCompleted(LoadOperation<Customer> lo)
{
    if (lo.HasError)
    {
        MessageBox.Show(string.Format("Retrieving data failed: {0}", lo.Error.Message));
        lo.MarkErrorAsHandled();
    }
}

데이터 제출 시 오류 처리

데이터를 제출할 때 Load 메서드의 경우처럼 예외를 해제하도록 선택할 수 없습니다. 데이터를 제출할 때 오류가 발생하면 예외가 발생합니다. 특히 다음 옵션 중에서 선택할 수 있습니다.

  • SubmitChanges 메서드를 사용하고 콜백 메서드를 매개 변수로 제공합니다. 콜백 메서드에서 오류를 처리하고 MarkErrorAsHandled 메서드를 호출하여 예외가 throw되지 않도록 지정합니다.

  • SubmitChanges 메서드를 사용합니다. 데이터를 제출할 때 오류가 발생하면 처리되지 않은 예외가 발생합니다.

다음 예제에서는 오류를 처리하기 위해 콜백 메서드와 함께 SubmitChanges 메서드를 호출하는 방법을 보여 줍니다.

Private Sub SaveButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    _customerContext.SubmitChanges(AddressOf OnSubmitCompleted, Nothing)
End Sub

Private Sub RejectButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    _customerContext.RejectChanges()
    CheckChanges()
End Sub

Private Sub CustomerGrid_RowEditEnded(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridRowEditEndedEventArgs)
    CheckChanges()
End Sub

Private Sub CheckChanges()
    Dim changeSet = _customerContext.EntityContainer.GetChanges()
    ChangeText.Text = changeSet.ToString()

    Dim hasChanges = _customerContext.HasChanges
    SaveButton.IsEnabled = hasChanges
    RejectButton.IsEnabled = hasChanges
End Sub

Private Sub OnSubmitCompleted(ByVal so As SubmitOperation)
    If (so.HasError) Then
        MessageBox.Show(String.Format("Submit Failed: {0}", so.Error.Message))
        so.MarkErrorAsHandled()
    End If
    CheckChanges()
End Sub
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
    _customerContext.SubmitChanges(OnSubmitCompleted, null);
}

private void RejectButton_Click(object sender, RoutedEventArgs e)
{
    _customerContext.RejectChanges();
    CheckChanges();
}

private void CustomerGrid_RowEditEnded(object sender, DataGridRowEditEndedEventArgs e)
{
    CheckChanges();
}

private void CheckChanges()
{
    EntityChangeSet changeSet = _customerContext.EntityContainer.GetChanges();
    ChangeText.Text = changeSet.ToString();

    bool hasChanges = _customerContext.HasChanges;
    SaveButton.IsEnabled = hasChanges;
    RejectButton.IsEnabled = hasChanges;
}

private void OnSubmitCompleted(SubmitOperation so)
{
    if (so.HasError)
    {
        MessageBox.Show(string.Format("Submit Failed: {0}", so.Error.Message));
        so.MarkErrorAsHandled();
    }
    CheckChanges();
}

호출 작업에서의 오류 처리

작업을 호출하는 경우 데이터를 제출할 때와 동일한 옵션을 사용할 수 있습니다. 특히 다음 옵션 중에서 선택할 수 있습니다.

  • 호출 작업을 호출할 때 콜백 메서드를 포함합니다. 콜백 메서드에서 오류를 처리하고 MarkErrorAsHandled 메서드를 호출하여 예외가 throw되지 않도록 지정합니다.

  • 콜백 메서드를 포함하지 않고 호출 작업을 호출합니다. 메서드를 호출할 때 오류가 발생하면 처리되지 않은 예외가 발생합니다.

다음 예제에서는 콜백 메서드를 사용하는 호출 작업을 보여 줍니다.

Dim invokeOp As InvokeOperation(Of Integer)
invokeOp = customerContext.GetLocalTemperature(selectedPostalCode, AddressOf OnInvokeCompleted, Nothing)

Private Sub OnInvokeCompleted(ByVal invOp As InvokeOperation(Of Integer))
  If (invOp.HasError) Then
    MessageBox.Show(String.Format("Method Failed: {0}", invOp.Error.Message))
    invOp.MarkErrorAsHandled()
  Else
    result = invOp.Value
  End If
End Sub
InvokeOperation<int> invokeOp = customerContext.GetLocalTemperature(selectedPostalCode, OnInvokeCompleted, null);

private void OnInvokeCompleted(InvokeOperation<int> invOp)
{
  if (invOp.HasError)
  {
    MessageBox.Show(string.Format("Method Failed: {0}", invOp.Error.Message));
    invOp.MarkErrorAsHandled();
  }
  else
  {
    result = invokeOp.Value;
  }
}

인증 서비스에서의 오류 처리

AuthenticationService 클래스를 사용하여 다음 메서드를 호출할 때 콜백 메서드를 제공할 수 있습니다.

콜백 메서드에서 인증 서비스의 오류를 처리하는 코드를 제공할 수 있습니다. 다음 예제에서는 로그인 단추에 대한 이벤트 처리기에서 Login 메서드를 호출하는 방법을 보여 줍니다. 로그인 작업의 결과에 응답하기 위해 콜백 메서드가 포함되어 있습니다.

Private Sub LoginButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    Dim lp As LoginParameters = New LoginParameters(UserName.Text, Password.Password)
    WebContext.Current.Authentication.Login(lp, AddressOf Me.LoginOperation_Completed, Nothing)
    LoginButton.IsEnabled = False
    LoginResult.Text = ""
End Sub

Private Sub LoginOperation_Completed(ByVal lo As LoginOperation)
    If (lo.HasError) Then
        LoginResult.Text = lo.Error.Message
        LoginResult.Visibility = System.Windows.Visibility.Visible
        lo.MarkErrorAsHandled()
    ElseIf (lo.LoginSuccess = False) Then
        LoginResult.Text = "Login failed. Please check user name and password."
        LoginResult.Visibility = System.Windows.Visibility.Visible
    ElseIf (lo.LoginSuccess = True) Then
        SetControlVisibility(True)
    End If
    LoginButton.IsEnabled = True
End Sub
private void LoginButton_Click(object sender, RoutedEventArgs e)
{
    LoginParameters lp = new LoginParameters(UserName.Text, Password.Password);
    WebContext.Current.Authentication.Login(lp, this.LoginOperation_Completed, null);
    LoginButton.IsEnabled = false;
    LoginResult.Text = "";
}

private void LoginOperation_Completed(LoginOperation lo)
{
    if (lo.HasError)
    {
        LoginResult.Text = lo.Error.Message;
        LoginResult.Visibility = System.Windows.Visibility.Visible;
        lo.MarkErrorAsHandled();
    }
    else if (lo.LoginSuccess == false)
    {
        LoginResult.Text = "Login failed. Please check user name and password.";
        LoginResult.Visibility = System.Windows.Visibility.Visible;
    }
    else if (lo.LoginSuccess == true)
    {
        SetControlVisibility(true);
    }
    LoginButton.IsEnabled = true;
}