更新:
这可以让您更深入地了解您想要做什么。由于你不能抛出异常,你应该有一个基结果类。我通常对通过 javascript 调用的 WCF 方法执行此操作,因为它不能很好地处理异常。
所以你会想要一个像这样的基类:
[DataContract]
public class AjaxResult
{
public static AjaxResult GetSuccessResult()
{
return new AjaxResult();
}
[DataMember]
public int Status { get; set; }
[DataMember]
public string Error { get; set; }
}
然后您可以继承它,添加您想要返回的任何数据。此示例返回单个产品对象和验证错误列表。
[DataContract]
public class SingleProductResult : AjaxResult
{
[DataMember]
public Product Data { get; set; }
[DataMember]
public IList<int> ValidationErrors { get; set; }
}
您还可以选择创建一个通用包装器,这样您就不必在方法中编写太多代码。我通常将它放在一个基类中,并让所有 WCF 服务都从该类继承。
protected T PerformAjaxOperation<T>(Func<T> action) where T : AjaxResult, new()
{
try
{
return action();
}
catch (AccessDeniedException ade)
{
// -- user tried to perform an invalid action
return new T()
{
Status = AjaxErrorCodes.AccessDenied,
Error = ade.ToString()
};
}
catch (Exception ex)
{
return new T()
{
Error = ex.ToString(),
Status = 1
};
}
}
然后像这样使用它:
public SingleProductResult GetProduct(int productId)
{
return PerformAjaxOperation(() =>
{
return retval = new SingleProductResult()
{
Data = ProductServiceInstance.GetProduct(productId)
};
});
}
public AjaxResult DeleteProduct(int productId)
{
return PerformAjaxOperation(() => {
ProductServiceInstance.DeleteProduct(productId);
return AjaxResult.GetSuccessResult();
});
}
因此,如果一切顺利,error 将为 0,message 将为空。如果抛出异常,那么它将被PerformAjaxOperation()
函数捕获并填充到AjaxResult
对象(或其派生对象)中并返回给客户端。
上一个答案:
我不认为这是一个好主意。您可以做的是通过创建一个类来创建自定义异常,该类继承自Exception
并添加要保存的属性。然后,当发生异常时,您只需捕获它并将其与其他详细信息一起填充到这个新异常中。然后抛出这个异常。然后,您可以在更高级别捕获此异常并显示正确的消息。
一个例子:
public IList<Articles> GetArticles()
{
try
{
return GetSomeArticlesFromDatabase();
}
catch (Exception innerException)
{
throw new MyCustomException("some data", 500, innerException);
}
}
public class MyCustomException : Exception
{
public int HttpCode { get; set; }
public MyCustomException(string errorMessage, int httpCode, Exception innerException)
: base(errorMessage, innerException) {
HttpCode = httpCode;
}
}
public void EntryPoint()
{
try
{
DoSomething();
var result = GetArticles();
DoSomething();
DisplayResult(result);
}
catch (MyCustomException ex)
{
ReturnHttpError(ex.Message, ex.HttpCode);
}
}