gpt4 book ai didi

c# - 我如何设置返回以便它接受 class1 或 class2?

转载 作者:太空狗 更新时间:2023-10-29 23:58:10 24 4
gpt4 key购买 nike

我如何在我的函数中开始填充它应该返回的类的参数,但如果发生异常我将返回我的错误类?

public **** function()
{
try
{
Articles articles = new Articles();
articles.articleid = 234;
articles.articlename = "Milk";
articles.deleted = 0;

//continue fill Articles
//and an exception occurs


return articles;

}
catch (Exception e)
{
Errors Error = new Errors();
Error.exceptionmessage = e.Message;
Error.exceptionname = e.ToString();
Error.httpcode = 500;


return Error;
}
}

这是否可能并且是一件好事?或者我应该只用我的错误类扩展所有返回类,即使我将返回很多带有空值分配的信息。我想发送尽可能少的数据,如果我的函数失败,我只会发回错误。

更新

抱歉没有提供足够的信息来说明我的情况,这是我想在网络服务中使用的功能

[OperationContract]
[WebGet(
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json)]
**** Function();

所以我不认为我可以抛出异常。如果一切顺利,我想返回一类文章,这样我就不必将数据转换为 JSON,但如果出现问题,我想向客户端发送 http 代码 500 内部服务器错误。我还没有阅读所有答案,但我认为我必须在所有其他返回类中包含我的错误类,以便客户端现在可以在出现问题时进行处理?

最佳答案

更新:

这样可以更深入地了解您想做什么。由于不能抛出异常,因此应该有一个基结果类。我通常为通过 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 将为 null。如果抛出异常,那么它将被 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);
}
}

关于c# - 我如何设置返回以便它接受 class1 或 class2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17694296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com