C# 使用事件或..从类执行返回。。?
我将提供一个简单的例子来说明我正在尝试做什么——希望这是可能的 我基本上有一个类,它对数据进行了大量的格式化/分析。因此,这可能会导致很多问题。我遇到的问题是当事情出错时如何处理课堂。我希望一旦发生错误,该类的所有执行都停止 该类(AnalyzingStuff)是从父窗体调用的,该父窗体根据该类执行的结果执行各种操作 理想情况下,我会触发一个名为say“ABORT”的事件 因此,在此代码中,我执行以下操作:C# 使用事件或..从类执行返回。。?,c#,winforms,class,events,event-handling,C#,Winforms,Class,Events,Event Handling,我将提供一个简单的例子来说明我正在尝试做什么——希望这是可能的 我基本上有一个类,它对数据进行了大量的格式化/分析。因此,这可能会导致很多问题。我遇到的问题是当事情出错时如何处理课堂。我希望一旦发生错误,该类的所有执行都停止 该类(AnalyzingStuff)是从父窗体调用的,该父窗体根据该类执行的结果执行各种操作 理想情况下,我会触发一个名为say“ABORT”的事件 因此,在此代码中,我执行以下操作: Class AnalyzingStuff{ public event EventHan
Class AnalyzingStuff{
public event EventHandler ABORT;
public AnalyzingStuff(){
for(int i = 0; i < 999999; i ++){
AnalyzeSomeStuff();
AnalyzerSomeOtherStuff();
}
MoreStuff();
OtherStuff();
}
private void AnalyzeSomeStuff(){
if(someconditionNotMet){
//EXIT OUT OF THIS CLASS, STOP EXECUTION!!!
this.ABORT.Invoke(this, null);
}
}
}
Class AnalyzingStuff{
public AnalyzingStuff(){
for(int i = 0; i < 999999; i ++){
if (!AnalyzeSomeStuff() || !AnalyzerSomeOtherStuff())
break;
}
MoreStuff();
OtherStuff();
}
private bool AnalyzeSomeStuff(){
if(someconditionNotMet){
return false;
}
return true;
}
}
类分析程序{
公共事件事件处理程序中止;
公共分析{
对于(int i=0;i<999999;i++){
分析某物();
AnalyzerSomeOtherStuff();
}
MoreStuff();
其他材料();
}
私有void analyzesomething(){
如果(某些条件未满足){
//退出该类,停止执行!!!
this.ABORT.Invoke(this,null);
}
}
}
调用这个'ABORT'事件,我将停止这个类的执行(停止循环,不做任何其他事情)。我还可以在其他父窗体中捕获此事件处理程序。不幸的是,我找不到任何方法来停止这个类的执行
迄今为止的想法:
编辑:我在整个代码中使用了一系列try/catch块,用于处理可能发生的不同错误。不幸的是,并不是所有这些都要求中止,所以需要立即捕获它们。因此,try/catch不是最理想的方法。。或者是吗?如果出现问题,是否可以抛出一个异常,并在循环中调用该方法的地方运行try-catch 如果您这样做,您可以在类失败时执行一些操作(您将把这些操作放在catch中),并且可以在完成时关闭与数据库++的连接 或者,您可以让这些方法返回一个int,以判断该方法的执行是否有效。例如,返回0;如果执行有效,则返回1-500可能是不同的错误代码。或者你也可以选择简单的传球方式。如果需要从错误代码以外的方法返回值,可以将这些值作为变量传递出去。例如:
Class AnalyzingStuff{
public event EventHandler ABORT;
public AnalyzingStuff(){
for(int i = 0; i < 999999; i ++){
AnalyzeSomeStuff();
AnalyzerSomeOtherStuff();
}
MoreStuff();
OtherStuff();
}
private void AnalyzeSomeStuff(){
if(someconditionNotMet){
//EXIT OUT OF THIS CLASS, STOP EXECUTION!!!
this.ABORT.Invoke(this, null);
}
}
}
Class AnalyzingStuff{
public AnalyzingStuff(){
for(int i = 0; i < 999999; i ++){
if (!AnalyzeSomeStuff() || !AnalyzerSomeOtherStuff())
break;
}
MoreStuff();
OtherStuff();
}
private bool AnalyzeSomeStuff(){
if(someconditionNotMet){
return false;
}
return true;
}
}
类分析程序{
公共分析{
对于(int i=0;i<999999;i++){
如果(!AnalyzeSomeStuff()| |!AnalyzerSomeOtherStuff())
打破
}
MoreStuff();
其他材料();
}
私人bool analyzesomething(){
如果(某些条件未满足){
返回false;
}
返回true;
}
}
您当然可以使用您的事件。为了简单起见,我删除了它。不要在构造函数中使用analysys。在main Analyze()方法中执行此操作 使用异常。如果由于致命错误而要中止,请引发致命异常。也就是说,抛出一个在主分析方法范围内未捕获的异常
class Analyzer
{
public Analyzer()
{
// initialize things
}
public void Analyze()
{
// never catch a fatal exception here
try
{
AnalyzeStuff();
... optionally call more methods here ...
}
catch (NonFatalException e)
{
// handle non fatal exception
}
... optionally call more methods (wrapped in try..catch) here ...
}
private void AnalyzeStuff()
{
// do stuff
if (something nonfatal happens)
throw new NonFatalException();
if (something fatal happens)
throw new FatalException();
}
}
外部:
{
var analyzer = new Analyzer();
try
{
analyzer.Analyze();
}
catch (FatalException)
{
Console.WriteLine("Analysis failed");
}
}
如果您不喜欢以这种方式使用异常,您可以通过让每个分析方法返回bool来完成相同的任务:
if (!AnalyzeStuff())
return false;
if (!AnalyzeMoreStuff())
return false;
...
return true;
但最终会有很多返回语句或大括号。这是风格和偏好的问题。有效的解决方案。我唯一的问题是,我使用了一系列的try-and-catch来获取可能发生的其他异常。并非所有这些我都希望发生中止。更新了答案,并使用了另一种不使用异常的方式。