首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不同的返回类型函数中返回错误消息?

如何在不同的返回类型函数中返回错误消息?
EN

Stack Overflow用户
提问于 2017-01-20 06:37:34
回答 3查看 5.8K关注 0票数 0

此函数连接到postgres数据库并返回Dataset。

有两件事我想理解

  1. 如果我得到一个错误,我如何返回它?
  2. 这是返回数据集的最佳方法吗? 字符串strODBCDriverName = "DSN=Postgres_32";公共DataSet SelectDataSet(string sql,bool isProcedure,Dictionary isProcedure= null) { else (OdbcConnection odbcConnection =新OdbcConnection(strODBCDriverName)) { odbcConnection.Open();else (OdbcCommand odbcCommand =新OdbcCommand(sql,odbcConnection)) { if (isProcedure) odbcCommand.CommandType =OdbcCommand;如果(参数!= null) foreach (KeyValuePair参数在参数中)object> parameter.Value);使用(OdbcDataAdapter适配器=新OdbcDataAdapter(odbcCommand)) { try (DataSet ds =新DataSet()) {try{ adapter.Fill(ds);返回ds;} catch (异常ex) {抛出(ex);}最后{}}}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-20 07:40:55

我喜欢通用的Result class,它可以重用:

代码语言:javascript
运行
复制
internal class Result
    {
    internal bool IsFailure => !IsSuccess;

    internal bool IsSuccess { get; }

    internal string Error { get; }

    protected Result(bool isSuccess, string error) {
        IsSuccess = isSuccess;
        Error = error;
    }

    private Result(bool isSuccess) : this(isSuccess, null) { }

    internal static Result Fail(string error) => new Result(false, error);

    internal static Result<T> Fail<T>(string error) =>
        new Result<T>(default(T), false, error);

    internal static Result Ok() => new Result(true);

    internal static Result<T> Ok<T>(T value) => new Result<T>(value, true);
}

internal sealed class Result<T> : Result
    {
    internal T Value { get; }

    internal Result(T value, bool isSuccess) : this(value, isSuccess, null) { }

    internal Result(T value, bool isSuccess, string error) : base(isSuccess, error) {
        Value = value;
    }

这不仅可以用于DataSet,也可以用于任何类型。

在您的示例中,返回将是Result<DataSet>,返回可以变成:

returns ds -> new Result.Ok(d)

throw ex -> new Result.Fail<DataSet>(ex.Message)

票数 3
EN

Stack Overflow用户

发布于 2017-01-20 06:49:30

如果您返回null,我认为这将是很好的;如果您需要返回一些定制的消息,也意味着您可以为此使用out参数。因此,如果出现任何异常,则返回值为null --在本例中,out参数将包含异常详细信息。如果数据集填充得很好,就意味着outParameter将有一个“成功”或类似的值。因此,方法签名将更改如下所示

代码语言:javascript
运行
复制
public static DataSet SelectDataSet(string sql, bool isProcedure, out string message, Dictionary<string, object> parameters = null)
{
    // Rest of codes here

    try
    {
        message = "Success";
        adapter.Fill(ds);
        return ds;
    }
    catch (Exception ex)
    {
        message = ex.Message;
        return null;
    }

}

你可以这样调用这个方法:

代码语言:javascript
运行
复制
string message = String.Empty;
DataSet resultDataset = SelectDataSet("query here", false, out message);
if (resultDataset != null)
{
    Console.WriteLine(message);
    // proceed with resultDataset
}
else
{
    Console.WriteLine(message);
}

在这里,如果出现任何异常,resultDataset将为null,否则您可以继续使用它的值。

票数 0
EN

Stack Overflow用户

发布于 2017-01-20 07:01:52

创建一个类:

代码语言:javascript
运行
复制
class DataSetWithError: DataSet
{
    public Exception msg { get; set; }
}

查询期间保存错误:

代码语言:javascript
运行
复制
using (OdbcDataAdapter adapter = new OdbcDataAdapter(odbcCommand))
{
    DataSetWithError ds = new DataSetWithError();

    try
    {
        adapter.Fill(ds);
    }
    catch (Exception ex)
    {
        ds.msg = ex;
    }
    finally
    {
        adapter.Close();
    }

    return ds;
}

和结果:

代码语言:javascript
运行
复制
DataSetWithError dataSetWithError = SelectDataSet();
if (dataSetWithError.msg == null)
{
    // Show data
}
else
{
    MessageBox.Show(dataSetWithError.msg.ToString());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41757502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档