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

标签 c# class

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

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/

相关文章:

c# - 当工作线程试图在主线程上调用某些东西时出现死锁

Python:如何根据参数将类变量设置为 __init__()?

java - 如何从子类修改父类(super class)变量?

Java类困惑

java - 在 Activity 和 View 类之间传递数据

c# - 如何在文本框中显示所有 List<class> 属性?

c# - 在另一个线程的断点上保持线程运行

java - 运行 Java 中所有方法的正确构造函数

c# - 正则表达式以避免 HTML 标签和空值

c# - 使用拖放的网站