Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#异常和代码破坏_C#_Windows_Winforms_Exception_Exception Handling - Fatal编程技术网

C#异常和代码破坏

C#异常和代码破坏,c#,windows,winforms,exception,exception-handling,C#,Windows,Winforms,Exception,Exception Handling,我有一个名为TryMe的方法,它有try-catch块并捕获他的异常。 我从另一个类调用他,但当发生异常时,它不会停止代码执行。 例如: 方法定义在类文件中。方法调用是在windows窗体中。 问题是它只显示messagebox,代码继续执行。 我想在捕获异常后停止代码,而不是隐藏表单。如果一切正常,它应该隐藏它。 也许我的想法是错误的?最简单的修复方法是根据函数是否成功将函数更改为返回true/false(即,仅在TryMe方法未出错时隐藏表单): 这样称呼它: if (CActions.T

我有一个名为
TryMe
的方法,它有try-catch块并捕获他的异常。
我从另一个类调用他,但当发生异常时,它不会停止代码执行。
例如:

方法定义在类文件中。方法调用是在windows窗体中。
问题是它只显示messagebox,代码继续执行。
我想在捕获异常后停止代码,而不是隐藏表单。如果一切正常,它应该隐藏它。

也许我的想法是错误的?

最简单的修复方法是根据函数是否成功将函数更改为返回true/false(即,仅在TryMe方法未出错时隐藏表单):

这样称呼它:

 if (CActions.TryMe())
 {
   this.Hide();
 }
另一个选项是在显示消息后重新抛出异常,并让调用代码在try-catch中处理它:

public void TryMe()
{
 try
 {
   SomeMethod();
  }
   catch (Exception exception)
  {
   // log exception? 
   throw;
  }
  }
呼叫代码:

   try 
   {
     CActions.TryMe();
     this.Hide();
   }
   catch (Exception ex)
   {
      // error handling
    }

最简单的修复方法是根据函数是否成功将其更改为返回true/false(即,仅在TryMe方法未出错时隐藏表单):

这样称呼它:

 if (CActions.TryMe())
 {
   this.Hide();
 }
另一个选项是在显示消息后重新抛出异常,并让调用代码在try-catch中处理它:

public void TryMe()
{
 try
 {
   SomeMethod();
  }
   catch (Exception exception)
  {
   // log exception? 
   throw;
  }
  }
呼叫代码:

   try 
   {
     CActions.TryMe();
     this.Hide();
   }
   catch (Exception ex)
   {
      // error handling
    }

另一个选项是将控制流委托给调用方,因此:

public void TryMe()
{
    try
    {
        SomeMethod();
    }
    catch(Exception exception){
       throw;
    }
}
像这样使用它

 Actions CAactions = new Actions();
 try {
    CActions.TryMe();
    //continue, all ok.
 }
 catch(Excepiton ex) {
      //hide a form, exception happens inside a method
 }

另一个选项是将控制流委托给调用方,因此:

public void TryMe()
{
    try
    {
        SomeMethod();
    }
    catch(Exception exception){
       throw;
    }
}
像这样使用它

 Actions CAactions = new Actions();
 try {
    CActions.TryMe();
    //continue, all ok.
 }
 catch(Excepiton ex) {
      //hide a form, exception happens inside a method
 }

正如您的代码所述,正在捕获
异常
,它的
消息
属性被传递到
消息框
。这意味着,无论如何,您的代码都不会被中断,
异常也不会有冒泡的机会

另一方面:在类try/catch(或任何其他方法)中显示
MessageBox
,这被认为是有点不好的做法。这样做的原因很明显:它使类依赖于在图形应用程序环境中使用,这不利于类的可重用性。最好沿着任何类型的应用程序都可以处理的方法返回类型传播
异常
,例如,包含
消息
和/或
内部异常
文本的字符串

你可以这样做

string methodResult = myObject.MyMethod();
if(String.IsNullOrEmpty(myMethodResult)) //... everything worked out ok
...
else //well then at least you have an error message to work with

正如您的代码所述,正在捕获
异常
,它的
消息
属性被传递到
消息框
。这意味着,无论如何,您的代码都不会被中断,
异常也不会有冒泡的机会

另一方面:在类try/catch(或任何其他方法)中显示
MessageBox
,这被认为是有点不好的做法。这样做的原因很明显:它使类依赖于在图形应用程序环境中使用,这不利于类的可重用性。最好沿着任何类型的应用程序都可以处理的方法返回类型传播
异常
,例如,包含
消息
和/或
内部异常
文本的字符串

你可以这样做

string methodResult = myObject.MyMethod();
if(String.IsNullOrEmpty(myMethodResult)) //... everything worked out ok
...
else //well then at least you have an error message to work with

您应该避免在任何地方调用
MessageBox.Show()
,而是在应用程序的UI端(例如表单)。这被认为是一种不好的做法。所以我要修改NDJ的答案:

public bool TryMe()
{
   try
   {
       SomeMethod();
       return true;
   }
   catch (Exception exception)
   {
       //insert some logging here, if YOU need the callstack of your exception
       return false;
   }
}

if (CActions.TryMe())
{
    this.Hide();
}
else
{
    MessageBox.Show(...); //insert some meaningful message, useful to END-USER here, not some "Null refrence exception!!11" message, which no one but you will understand
}

您应该避免在任何地方调用
MessageBox.Show()
,而是在应用程序的UI端(例如表单)。这被认为是一种不好的做法。所以我要修改NDJ的答案:

public bool TryMe()
{
   try
   {
       SomeMethod();
       return true;
   }
   catch (Exception exception)
   {
       //insert some logging here, if YOU need the callstack of your exception
       return false;
   }
}

if (CActions.TryMe())
{
    this.Hide();
}
else
{
    MessageBox.Show(...); //insert some meaningful message, useful to END-USER here, not some "Null refrence exception!!11" message, which no one but you will understand
}

非常感谢。这是一个好的编码实践吗?我是C#的新手,如果我的整个错误处理模型思维都是错误的,那么改变它的最佳时机就是现在有许多选项-您可以从TryMe中重新返回错误(通过在catch块中放入Throw()),并让调用代码也处理错误当然,这是一个选项。但是哪一个是最好的呢?我的意思是准确、干净和可读的代码之间的平衡?我认为这归结为,如果异常是预期的,并且您知道您的方法可以处理它,那么就沿着bool路线走——如果异常只是一个异常——那么调用代码应该具有try/catch功能谢谢!这是一个好的编码实践吗?我是C#的新手,如果我的整个错误处理模型思维都是错误的,那么改变它的最佳时机就是现在有许多选项-您可以从TryMe中重新返回错误(通过在catch块中放入Throw()),并让调用代码也处理错误当然,这是一个选项。但是哪一个是最好的呢?我的意思是准确、干净和可读代码之间的平衡?我认为这归结为,如果异常是预期的,并且您知道您的方法可以处理它,那么就沿着bool路线走——如果异常就是这样——一个异常——那么调用代码应该具有try/catchThank!但我想知道在形式课上试一试是不是一种好的练习?@PaulReed:当然,这是一种方法。Form类是您的调用者,所以它知道在某个调用失败或成功时应该发生什么将覆盖原始异常的调用堆栈。这是有意的吗?通常最好只使用
throw谢谢!但我想知道在形式课上试一试是不是一种好的练习?@PaulReed:当然,这是一种方法。Form类是您的调用者,所以它知道在某个调用失败或成功时应该发生什么将覆盖原始异常的调用堆栈。这是有意的吗?通常最好只使用
throw