6

Web サービスの一部として、このような Web メソッドがあります。

public List<CustomObject> GetInformation() {
    List<CustomObject> cc = new List<CustomObject>();

    // Execute a SQL command
    dr = SQL.Execute(sql);

    if (dr != null) {
       while(dr.Read()) {
           CustomObject c = new CustomObject()
           c.Key = dr[0].ToString();
           c.Value = dr[1].ToString();
           c.Meta = dr[2].ToString();
           cc.Add(c);
       }
    }
    return cc;
}

これにエラー処理を組み込みたいので、行が返されない場合、または何か問題が発生した場合は、エラーの説明の形式で例外を返しますdrnullただし、関数が返さList<CustomObject>れる場合、何か問題が発生したときにクライアントにエラーメッセージを返すにはどうすればよいですか?

4

2 に答える 2

4

あなたListCustomObject情報とエラー情報の両方を別のプロパティとして持つラッパー クラスを作成します。

public class MyCustomerInfo
{
  public List<CustomObject> CustomerList { set;get;}
  public string ErrorDetails { set;get;}

  public MyCustomerInfo()
  {
    if(CustomerList==null)
       CustomerList=new List<CustomObject>();  
  }
}

ここで、メソッドからこのクラスのオブジェクトを返します

public MyCustomerInfo GetCustomerDetails()
{
  var customerInfo=new MyCustomerInfo();

  // Execute a SQL command
    try
    {
      dr = SQL.Execute(sql);

      if(dr != null) {
         while(dr.Read()) {
           CustomObject c = new CustomObject();
           c.Key = dr[0].ToString();
           c.Value = dr[1].ToString();
           c.Meta = dr[2].ToString();
           customerInfo.CustomerList.Add(c);
         }
      }
      else
      {
          customerInfo.ErrorDetails="No records found";
      } 
   }
   catch(Exception ex)
   {
       //Log the error in this layer also if you need it.
       customerInfo.ErrorDetails=ex.Message;
   }     
  return customerInfo;    
}

編集: より再利用可能で一般的なものにするために、これを処理する別のクラスを作成することをお勧めします。これを Baseclass にプロパティとして設定します

public class OperationStatus
{
  public bool IsSuccess { set;get;}
  public string ErrorMessage { set;get;}
  public string ErrorCode { set;get;}
  public string InnerException { set;get;}
}
public class BaseEntity
{
  public OperationStatus OperationStatus {set;get;}
  public BaseEntity()
  {
      if(OperationStatus==null)
         OperationStatus=new OperationStatus();
  } 
}

そして、トランザクションに関与するすべての子エンティティがこの基本クラスから継承できるようにします。

   public MyCustomInfo : BaseEntity
   {
      public List<CustomObject> CustomerList { set;get;}
      //Your constructor logic to initialize property values
   } 

メソッドから、必要に応じて OperationStatus プロパティの値を設定できます

public MyCustomInfo GetThatInfo()
{
    var thatObject=new MyCustomInfo();
    try
    {
       //Do something 
       thatObject.OperationStatus.IsSuccess=true;
    }
    catch(Exception ex)
    {
      thatObject.OperationStatus.ErrorMessage=ex.Message;
      thatObject.OperationStatus.InnerException =(ex.InnerException!=null)?ex.InnerException:"";
    }
    return thatObject;
}
于 2012-06-30T00:40:35.417 に答える
0

WCFを使用していますか?その場合はfaultsの使用を検討してください。

于 2012-06-30T01:24:33.433 に答える