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

Waq*_*Ali 4 c# exception

createFolding我正在我的类中创建一个名为 的函数clsFolding。我通过这个函数在数据库中插入一些值createFolding。所以,我int status_id从函数返回(如果正常则返回 1,如果错误则返回 0)。如果出现错误(if),我还想从函数返回异常消息,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;
        }
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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); 
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*orn 5

我认为你忽略了例外的要点。你很少能在它们被扔的地方接住它们。例外的要点是让它们冒出来。如果做得正确,您的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();
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

我还会对这些 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); 
}
Run Code Online (Sandbox Code Playgroud)