我是C#编程的初学者。我在使用表单构建应用程序时遇到了小问题。我将尝试在我的能力和经验中正确解释它。当我试图处理由Form1中实例化的Class1引起的异常时遇到的问题。假设我在Class1中有函数“public int Calc(int a,int b)”。在Form1中,我已经将这个类实例化为“Calc”函数。如果我想传达一个错误(f.e:除以零),我必须将函数调用包装到try / catch元素中:
// Form1中:
Class1 C1 = new Class1();
int a = 5;
int b = 0;
int c = 0;
try{
c = C1.Calc(a,b)
}
catch(DivideByZeroException e)
{
// some error handling code
}
...我认为这个例子不是正确的OOP技术所以我不得不决定将try / catch元素直接放入Class1:
// Class1的:
public int Calc(int a, int b)
{
int c = 0;
try{
c = a/b;
}
catch(DivideByZeroException e)
{
// .........
}
return c;
}
...问题是,如何将消息(DivideByZeroException e)添加到我的Form1中以便能够处理并发送消息。我不想在Form1中创建一些静态函数只是为了从Class1到达它的MessageBox类,因为它没有在适当的OOP功能和Class1的可重用性方面有所作为。我已经阅读过关于事件和委托(我理解的是类似于C ++的函数的简单指针),但它有点令人困惑,我没有将这种技术应用到我的代码中。能否请你写一个简单的例子来指出我正确的方向。
谢谢你们Cembo
答案 0 :(得分:7)
正确的技术确实是第一个。如果你无法在你的功能中处理它,那么你就没有尝试过。将异常处理放在可以处理异常的地方,程序可以继续(或正常退出),并以适当的方式通知用户错误。
答案 1 :(得分:2)
我建议您在Program.cs
文件
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
// -----------------
Application.ThreadException += Application_ThreadException;
// -----------------
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
// Handle your exception here...
MessageBox.Show(string.Format("There is an error\n{0}", e.Exception.Message));
}
这将在整个应用程序中捕获未处理的异常。
答案 2 :(得分:1)
为了让它冒泡到调用UI的范围内,你需要在捕获时抛出异常,或者更好的是,不要抛出异常 - 因为除以零将导致CLR抛出必要时例外。你可以在这里进行简单的检查,而Calc
API调用可能仍然会抛出异常。
例如,只需检查Calc
来电之前的数据:
if (a > 0 && b > 0)
{
var result = Calc(a, b);
}
else
{
//tell the user to input valid data
}
在Calc
方法中,您可以执行类似的检查并抛出相关的异常:
public int Calc(int a, int b)
{
if (a <= 0) throw new ArgumentException("appropriate message here");
if (b <= 0) throw new ArgumentException("appropriate message here");
...
}
这里的想法是防止除以零,但在你的情况下它可能有点过分,因为前面的例子表明你基本上可以提供相同的行为,但是现在你需要捕获异常:
try
{
var result = Calc(a, b);
}
catch //use appropriate exception catches
{
//tell the user to input valid data
}
答案 3 :(得分:0)
public int Calc(int a, int b)
{
int c = a/b;
}
使用您需要的重要逻辑,保持简洁明了。
然后首先在表单中处理错误。
答案 4 :(得分:-4)
一种简单的方法可能是将您的方法更改为类似
的方法public int Calc(int a, int b, out string error)
{
error = string.empty;
int c = 0;
try
{
c = a/b;
}
catch(DivideByZeroException e)
{
error = e.ToString();
}
return c;
}
现在在来电者中你可以查看
string error;
int res = Calc( 1, 2, out error);
if(!string.isnullorempty(error)
{
//error has occured
messagebox.show(error);
}
else
{
//no error
// you can proceed noramlly
}