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代码>