如何在类中从函数返回异常

本文关键字:函数 返回 异常 | 更新日期: 2023-09-27 18:34:05

我正在我的类中创建一个名为 clsFolding 的函数createFolding。我通过此功能在数据库中插入了一些值 createFolding.所以,我从函数返回int status_id(如果正常,则返回 1,如果错误,则返回 0)。如果出现错误(如果status_id =0),我还想从函数返回异常消息,但我不知道如何从我的函数返回多个值。这是我在课堂上完成的代码clsFolding

public class clsFolding
{
    public static string ConStr = ConfigurationManager.ConnectionStrings["FazalConstructions.Properties.Settings.ConnString"].ConnectionString;
    public static SqlConnection con;
    public static SqlCommand cmd = new SqlCommand();
    public static int status_id;
    public static Exception ex;
    public static int createFolding(int id, string name, int qty, string narration, DateTime dt)
    {
        try
        {
            con = new SqlConnection(ConStr);
            con.Open();
            cmd = new SqlCommand("INSERT INTO tblFolding(FoldingID, Name,Quantity,Narration,DateTime)VALUES(@id, @name, @qty, @narration,@dt)", con);
            cmd.Parameters.AddWithValue("@id", id);
            cmd.Parameters.AddWithValue("@name", name);
            cmd.Parameters.AddWithValue("@qty", qty);
            cmd.Parameters.AddWithValue("@narration", narration);
            cmd.Parameters.AddWithValue("@dt", dt);
            cmd.ExecuteNonQuery();
            status_id = 1;
            return status_id;
        }
        catch (Exception ex)
        {
            status_id = 0;
           return status_id;
        }
        ...
    }
    ...
}

这是我在表单中用于从类获取数据的代码

clsStockManagement.updateStock(
    int.Parse(TransactionID.Text), int.Parse(projectID.Text),
    int.Parse(cbItem.SelectedValue.ToString()),
    int.Parse(tbQty.Text), DateTimee.Value);
if (clsStockManagement.status_id==1)
{
    MessageBox.Show("Process Successful", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else if (clsStockManagement.status_id==0)
{
     MessageBox.Show("Process UnSuccessful", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
}

如何在类中从函数返回异常

我认为你错过了例外的重点。你很少在它们被扔的地方抓住它们。例外的要点是让它们冒泡。如果操作正确createFolding()方法不需要任何异常处理返回代码。它简化为:

public class clsFolding
{
    //no need for this to be public
    private static string ConStr = ConfigurationManager.ConnectionStrings["FazalConstructions.Properties.Settings.ConnString"].ConnectionString;
    public static void createFolding(int id, string name, int qty, string narration, DateTime dt)
    {
         string sql = "INSERT INTO tblFolding(FoldingID, Name,Quantity,Narration,DateTime)VALUES(@id, @name, @qty, @narration,@dt)";
         //fyi: a static SqlConnection reference is a VERY BAD IDEA
         // use a new variable in each method call
         using(var con = new SqlConnection(ConStr))
         using(var cmd = new SqlCommand(sql, con))
         {
             cmd.Parameters.AddWithValue("@id", id);
             cmd.Parameters.AddWithValue("@name", name);
             cmd.Parameters.AddWithValue("@qty", qty);
             cmd.Parameters.AddWithValue("@narration", narration);
             cmd.Parameters.AddWithValue("@dt", dt);
             con.Open();
             cmd.ExecuteNonQuery();
         }
    }
}

我也会对这些AddWithValue()调用做一些事情。

现在,您希望在此操作失败时显示消息框。没关系。这样做。这听起来是个好主意。只需在调用此方法的代码中执行此操作:

try 
{
   clsFolding.createFolding( /* parameters here */);
   MessageBox.Show("Process Successful", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (SqlException)
{
    MessageBox.Show("Process UnSuccessful, could not write to database", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
}
catch (Exception Ex)
{
    MessageBox.Show("Process UnSuccessful, a non-database error occured", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
}

创建一个模型(基本上是一个带有属性的类),它应该有一个整数和一个异常属性。

public class MyResult{
    public int Status {get; set;}
    public Exception Exception {get; set;}
}

现在你可以像这样从函数中返回这个类,

public static MyResult createFolding(int id, string name, int qty, string narration, DateTime dt)
{
    var result = new MyResult();
    try
    {
        // your code
        result.Status = 1;
    }
    catch(Exception e){
        result.Status = 0;
        result.Exception = e;
    }
    return result;
}

所以你期待函数createFolding MyResult

在我们的代码中,我们调用此函数应该是这样的,

var result = clsFoldingObj.createFolding(1,'abhi',1,'empty', new Date());
if(result.Status == 0){
    // result has an exception
    MessageBox.Show("Process Unsuccessful - "result.Exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
}
else{
    // Success 
    MessageBox.Show("Process Successful", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

如上面的注释中所述,最佳做法是抛出异常而不是返回异常。为此,请将示例的捕获部分更改为以下内容:

catch (Exception ex)
        {
           // You can log the exception here if you need to.
           throw;
        }

但是:要回答您关于如何返回多个值的问题,请创建一个新类,使用结果值实例化它并返回该类。

该类将具有 2 个属性:

public class TClass
{
  public int Result { get;set;}
  public Exception Error { get;set;}
} 

然后,您的示例代码将如下所示:

public static int createFolding(int id, string name, int qty, string narration, DateTime dt)
    {
        try
        {
            con = new SqlConnection(ConStr);
            con.Open();
            cmd = new SqlCommand("INSERT INTO tblFolding(FoldingID, Name,Quantity,Narration,DateTime)VALUES(@id, @name, @qty, @narration,@dt)", con);
            cmd.Parameters.AddWithValue("@id", id);
            cmd.Parameters.AddWithValue("@name", name);
            cmd.Parameters.AddWithValue("@qty", qty);
            cmd.Parameters.AddWithValue("@narration", narration);
            cmd.Parameters.AddWithValue("@dt", dt);
            cmd.ExecuteNonQuery();
            return new TClass { Result = 1 };
        }
        catch (Exception ex)
        {
            return new TClass { Result = o, Error = ex };
        }

您可以返回结构化信息,也可以更改某些参数等等。但最好您应该在能够处理它的地方捕获异常。

try
{
    clsStockManagement.updateStock(
        int.Parse(TransactionID.Text),
        int.Parse(projectID.Text),
        int.Parse(cbItem.SelectedValue.ToString()),
        int.Parse(tbQty.Text),
        DateTimee.Value);
    MessageBox.Show("Process Successful", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
    MessageBox.Show("Process UnSuccessful, error:" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}