2013-05-14 80 views
1

我有一个名为TryMe的方法,它有try catch块并捕获他的异常。
我从另一个类中调用他,但是当发生异常时它不会停止代码执行。
实施例:C#异常和代码破坏

public void TryMe() 
{ 
    try 
    { 
     SomeMethod(); 
    } 
    catch(Exception exception){ 
     MessageBox.Show(exception.Message); 
    } 
} 


    //Method calling 
    Actions CAactions = new Actions(); 
    CActions.TryMe(); 
    /////////////////////////////////// 
    //If exception is handled it should stop to here. 

    this.Hide(); 
    FormActions FormActions = new FormActions(); 

的方法定义在类文件中。该方法调用是在窗体中。
问题是它只是显示消息框并继续执行代码。
我想在异常捕获之后停止代码而不隐藏表单。如果一切顺利,它应该隐藏它。
也许我的想法是错误的?

回答

7

最简单的解决将是改变你的funcion返回真/假取决于它是否成功与否(即只隐藏表单,如果TryMe方法并没有得到一个错误):

public bool TryMe() 
{ 
    try 
    { 
    SomeMethod(); 
    return true; 
    } 
    catch (Exception exception) 
    { 
    // log exception 
    return false; 
    } 
    } 

并调用它像这样:

if (CActions.TryMe()) 
{ 
    this.Hide(); 
} 

另一种选择是重新抛出异常显示消息后,并有调用代码处理它在尝试捕捉:

public void TryMe() 
{ 
try 
{ 
    SomeMethod(); 
    } 
    catch (Exception exception) 
    { 
    // log exception? 
    throw; 
    } 
    } 

调用代码:

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

谢谢!这是一种很好的编码习惯吗?我是C#的新手,如果我的整个错误处理模型思路错误,现在就是改变它的最佳时刻。:) – 2013-05-14 07:08:22

+0

有许多选项 - 您可以从TryMe重新抛出错误(将Throw()放入catch块中)并让调用代码也处理错误 – NDJ 2013-05-14 07:10:18

+0

当然,这是一个选项。但哪一个是最好的?我的意思是准确的工作,干净和可读的代码之间的平衡? – 2013-05-14 07:12:39

2

另一种选择是委派控制流呼叫者,所以:

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 
} 
+0

谢谢!但是我想知道在表单类中进行try-catch是否是一个好习惯? – 2013-05-14 07:13:35

+0

@PaulReed:当然,这是做到这一点的方法之一。 Form类是你的调用者,所以它知道如果某个调用失败或成功会发生什么。 – Tigran 2013-05-14 07:16:33

+2

'抛出异常;'会覆盖原始异常的调用堆栈。它的目的是?通常最好只使用'throw;' – Artemix 2013-05-14 08:29:33

1

为你的代码州,Exception被捕获,并且它的Message财产传递给MessageBox。这意味着,绝不会让你的代码被打断,或者让你有机会冒泡。

附注:在类try/catch(或任何其他方法)中显示MessageBox被认为是一种不好的做法。原因很明显:它使你的类依赖于在图形应用程序环境中使用,并且违背了类的可重用性。最好沿着任何类型的应用程序可以处理的方法返回类型传播Exception,例如,包含Message和/或InnerException文本的字符串。

然后你可以做例如

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 
2

你应该避免调用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 
}