如何在类中从函数返回异常
本文关键字:函数 返回 异常 | 更新日期: 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);
}