C# winform程序 如何终止一个方法的执行 并返回主界面

假如我有这么一个方法
void A()
{
A1();
A2();
A3();
}

其中,A()方法通过点击某按钮触发执行。
在执行过程中,A1()方法出现异常,捕获异常后作出处理,弹出提示消息提醒用户检查输入。
如何让A2和A3都不再继续执行,并返回主窗体。

假如现在已经在A1()方法中加入了处理异常的语句,并且也成功捕获到异常且弹出了提示框。当关闭提示框后,A()方法并没有终止运行,却依旧义无反顾的执行A2和A3 这是怎么回事。

第1个回答  推荐于2017-09-12
如果你的异常处理添加在A1()中,那么异常处理之后仅仅返回到A1()的上层调用函数,也就是A()中。
由于A1()已经处理了异常,所以对于A()这一层而言,并没有异常发生,所以程序会继续,从而A2和A3将继续被执行。
如果你想中止A2和A3,那么你的异常处理必须写在调用它们的函数,也就是A()中。追问

我想让指定的方法完成拿来就用的功能 不想再调用方法里面写处理异常的代码 请问我这个想法应该如何来实现?

追答

呵呵 不太明白你的“拿来就用”的意思
如果想在异常发生时跳过A2和A3,直接返回,那么A就必须知道A1中发生了异常,但你又不想在调用方法里写异常处理,那么你可以通过A1的返回值来判定A1中是否发生了异常。
比如A1可以简单声明为
Boolean A1() { /*代码*/ }
那么你只需要在catch中返回false就可以了,而A中相应的改成
A()
{
if(A1())
{
A2();
A3();
}
}
如果有多种异常,只需要扩展一下A1的返回值,比如换成一个枚举值
public enum FailReason
{
Reason1,
Reason2,
// ...
}

追问

嗯 你说的其实我都想到了 也尝试了做一个bool型的标志来记录方法的执行结果
之所以来提问就是想找一个简便的方法 看来是找不到了
看来编程序还是得一点一点的来啊 要有耐心
谢谢你的指点

本回答被提问者采纳
第2个回答  2011-03-10
你应该将A1的异常抛出,然后让A来处理,例如:
public static void A()
{
try
{
A1();
A2();
}
catch (System.Exception e)
{
Console.WriteLine("A handle the exception!");
return;
}

}

public static void A1()
{
int i = 0;
int y = 1;
int z = 0;
try
{
z = y / i;
}
catch (System.Exception e)
{
throw e;
}

}

public static void A2()
{
Console.WriteLine("Here is method A2!");
}

另外你还可以在A1中抛出自己“描述”的异常,这样就可以在A中根据异常的Message属性来判断到底是A抛出的异常或者是其他地方抛出的异常:
public static void A1()
{
int i = 0;
int y = 1;
int z = 0;
try
{
z = y / i;
}
catch (System.Exception e)
{
throw new System.Exception("Divisor can't be zero!");
}

}
第3个回答  2011-03-10
首先呢可以这样
把A方法中的捕获异常删除
然后调用的时候
try
{
A();
B();
C();
}
catch
{
捕获异常
}
第4个回答  2011-03-10
try
{
A1();
A2();
A3();
}
catch(exception ex)
{
messagebox.show("请检查输入!");
return ;
}
第5个回答  2011-03-10
采用子线程,在主线程中实现

C# winform程序 如何终止一个方法的执行 并返回主界面
如果你的异常处理添加在A1()中,那么异常处理之后仅仅返回到A1()的上层调用函数,也就是A()中。由于A1()已经处理了异常,所以对于A()这一层而言,并没有异常发生,所以程序会继续,从而A2和A3将继续被执行。如果你想中止A2和A3,那么你的异常处理必须写在调用它们的函数,也就是A()中。

C# winform 点击一个按钮退出窗体 并关闭相应的进程
如楼上所示,直接在按钮的单击事件中写this.Close();就可以关闭窗体,同时相应的进程会自动关闭,不需要你自己处理。如果你是需要关闭进程的代码,则如下:先确定你的进程 Process[] plist = Process.GetProcessesByName("这里输入你的窗体名称");Process p = plist[0];结束进程的方式: p.Kill()...

C# WinForm 关闭之后还有进程在后台运行,如何实现彻底关闭
1、找到后台的运行线程,用BOOL变量控制;2、Environment.Exit(Environment.ExitCode); 用这个试试

C#中WinForm程序退出方法技巧总结
在C#中退出WinForm程序的方法有许多,如this.Close()、Application.Exit()、Application.ExitThread()、System.Environment.Exit(0)。其中,this.Close()仅关闭当前窗口,若非主窗体或存在托管线程,则无法实现程序干净退出;Application.Exit()强制关闭所有窗体,面对托管线程,同样难以正确退出;Application.Exit...

C#的winform中,窗口间的切换 和关闭
例如 有二个窗体类 form1、form2 两个窗口之间的切换,显示一个就隐藏另一个:form2 f1=new form2();f2.show();this.hide();(this 即为当前窗体类form2 )关闭其中一个就关闭整个程序:application.exit();这是将这个运行的程序关闭,就可将这两个窗体都关闭。

C#winform 点红叉叉按钮关闭一form后,后台仍在运行
有2种关闭窗口的方法:1.this.close(); \/\/关闭子窗体不能结束程序运行,只有关闭主窗体才能结束 2.Application.Exit();\/\/无论对哪个窗体执行此方法,都会结束 你的可能是主窗体被隐藏,所以单击子窗体上的关闭按钮是没用的 解决方法:在你所使用的窗体的 FormClosed 事件中添加 Application.Exit();...

c# winform程序,如何让程序只能通过自己调用的方法关闭,而不能用其他...
在c#中退出WinForm程序包括有很多方法,如:this.Close();Application.Exit();Application.ExitThread(); System.Environment.Exit(0);等他们各自的方法不一样,下面我们就来详细介绍一下。1.this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也...

C#winform 如何返回到历史界面?
winForm 没有 与webForm不一样,没有历史界面这个概念 你在Form1定义一个变量,其它窗体打和开Form1时把自身传给这个变量。这样就知道返回哪个窗口了

C# winform中实现暂停,结束,实时刷新父窗体数据?
在A窗体上写个方法:public void setText(string value){ textbox1.text=value } B窗体中声明一个委托 public delegate void GetTextDel(string value);public delegate Seter; \/\/这个写在类,里面哦!!然后修改B窗体的构造函数:public B( GetTextDel del){ ...Seter=del;} 在textbox2的...

c#在winform的load事件中如何取消后续执行
首先,load事件本身就是窗口打开后首触发的事件,无论load事件里面的程序有没有执行都不影响窗口打开的效果,除非关闭窗口。终止事件的可用return;然后this.close();就可以了。但不建议在load事件判断是否打开窗体。你可以把判断事件写在一个方法里,例如:public void load(){ if(ture)\/\/满足条件 {...

相似回答