捕获错误并返回方法结果

时间:2011-10-01 11:07:19

标签: c# wcf

我有自己的wcf服务类,如果确定保存数据,应该返回带有“Everything Save Saccesfully”的字符串。否则我需要返回此字符串异常。

string SaveData(Stream stream)
{
  string error = "";
  try
  {

  //do saving data
   error+="Everything Save Saccefully";
   return error;
  }
  catch(Exception ex)
  {
   throw ex;
  }
  finally
  { 
  }
}

可以捕获try块中发生的错误并将其返回错误变量吗?

4 个答案:

答案 0 :(得分:2)

嗯,表达错误的传统方式是只是通过异常 - 而不是返回值。缺乏例外应该意味着“一切都正常”。这是正常的惯用工作方式。

现在,偶尔值得拥有抛出异常的方法,而是通过out参数返回成功状态和潜在的单独结果。但这种情况相对较少 - 通常用于解析之类的事情,除了输入数据之外,除了输入数据之外没有其他任何错误时,以难以预测的方式失败是完全正常的。

在您的情况下,看起来这应该是void方法,它只会在出错时抛出异常。

答案 1 :(得分:1)

试试这个:

string SaveData(Stream stream) 
{ 
  string error; 
  try 
  { 
  //do saving data 
   error ="Everything saved Successfully"; 
   } 
  catch(Exception ex) 
  { 
   error = ex.Message;
  } 
 return error; 

}

答案 2 :(得分:1)

通常我会像Jon建议的那样做,但如果你真的不想允许任何例外从你的服务中冒出来,你可以在这样的类结构中封装你的成功和(任何)失败错误信息

public class ErrorInfo
{
    public string Message {get; set;}

    // TODO: Maybe add in other information about the error?
}

public class SaveResult
{
    public bool Success { get; set; }

    /// <summary>
    /// Set to contain error information if Success = false
    /// </summary>
    public ErrorInfo ErrorInfo { get; set; }
}

然后......

public SaveResult SaveData(Stream stream)
{
    SaveResult saveResult = new SaveResult();

    string error = "";
    try
    {
        //do saving data
        saveResult.Success = true;
    }
    catch (Exception ex)
    {
        saveResult.ErrorInfo = new ErrorInfo { Message = ex.Message };
    }
}

这种方法的缺点是调用者必须在调用Success后检查SaveData值。如果不这样做,可能会导致代码中的错误,只有在保存失败时才会显示错误。

或者,如果你不处理异常,你可以从structured exception handling的一个有用的东西中受益:如果调用者忘记显式处理任何异常,那么它将冒出调用堆栈并且崩溃应用程序或被一些更高级别的错误处理代码捕获。

不一定理想,但通常比你的代码更好地假设某些东西成功,而事实上并没有。

答案 3 :(得分:1)

您应该使用Faults在WCF中获得特殊结果。我不明白你为什么要在字符串中需要异常。但是如果你绝对需要这个,只需将return语句移到最后并在catch块中设置它的值。

string SaveData(Stream stream)
{
  string error = "";
  try
  {

  //do saving data
   error+="Everything Save Saccefully";
  }
  catch(Exception ex)
  {
   //throw ex; Do not throw, just return its string representation
   error+=ex.ToString();
  }
  finally
  { 
  }
  return error;
}