我如何强制执行到捕获块?

问题描述 投票:22回答:12

我想知道try..catch是否可以强制执行进入catch并在其中运行代码?

此处为示例代码:

try {
    if (AnyConditionTrue) {
      // run some code
    }
    else {
      // go catch
    }
} catch (Exception) {
    // run some code here...
}
c# exception-handling
12个回答
28
投票

而不是在else中引发异常,我建议从catch中提取代码到方法中,然后从其他方法中调用它

try
{
    if (AnyConditionTrue)
    {
        MethodWhenTrue();
    }
    else
    {
        HandleError();
    }
}
catch(Exception ex)
{
    HandleError();
}

0
投票

您可以抛出异常强制捕获

if(something == anything)
{
   throw new CustomException(" custom text message");
}

0
投票

您为什么要捕获异常?为什么不只在“ else”块中运行代码?如果必须这样做,则抛出一个新异常

throw new Exception(...);

0
投票

稍微复活,但我想同时添加一个样本(主要与其他样本相同)和一个用例。

throw new Exception();

在我的情况下,我有自定义控件-少数使用基本Windows.Forms控件的控件,但是添加了两个bool和一个用于跟踪的字符串,并且还自动注册到Singleton public int GetValueNum(string name) { int _ret = 0; try { Control c = (extendedControls.Single(s => s.ValueName == name) as Control); if (c.GetType() == typeof(ExtendedNumericUpDown)) _ret = (int)((ExtendedNumericUpDown)c).Value; else throw new Exception(); } catch { throw new InvalidCastException(String.Format("Invalid cast fetching .Value value for {0}.\nExtendedControllerListener.GetValueNum()", name)); } return _ret; } ,因此它们可以正常运行无需钻取控制容器即可获取(这是选项卡式表格)。

在这种情况下,我正在创建一些方法来通过名称字符串轻松获取值(List<T>)。对于.Value, .Text, .Checked, .Enabled,并非所有.Value对象都具有。如果扩展控件不是Control类型,则它是ExtendedNumericUpDown,因为不应针对该控件类型调用该方法。这不是流程,而是无效转换的规定用法。由于InvalidCastException自然不具有Control属性,因此Visual Studio不会让我仅强制尝试然后失败。


23
投票
   try{
      if (AnyConditionTrue){
              //run some code
               }
      else{
              throw new Exception();
          }
   }
   catch(){

      //run some code here...

   }

但是正如Yuck所说,我不建议这样做。您应该退后一步,重新设计,并寻求完成的目标。有一种更好的方法(即使用常规条件流,而不是异常处理)。


11
投票

是,您必须抛出异常:

  try
  {
    throw new Exception("hello");
  }
  catch (Exception)
  {

     //run some code here...
  }

2
投票
if(conditiontrue)
{

}
else{
    throw new Exception();
}

2
投票

抛出Exception并同样跳到Catch的有效方法:

try
{
   throw new Exception("Exception Message");
}
catch (Exception e)
{
   // after the throw, you will land here
}

1
投票

是,如果您尝试从尝试中将throw设置为异常,则将在捕获部分捕获该异常。

我不得不问你为什么要这么做呢?异常处理不能替代控制流。


1
投票

我认为您想要的是一个catch块:finally

查看此

http://msdn.microsoft.com/en-us/library/zwc8s4fz(v=vs.80).aspx

如果/当您这样做时,这是不同的:

try
 {
     doSomething();
 }
catch
 {
     catchSomething();
     throw an error
 } 
finally
 {
     alwaysDoThis();
 }

这是最后一个实例,如果发生错误,将执行捕获,但不执行try { doSomething(); } catch { catchSomething(); throw an error } alwaysDoThis();// will not run on error (in the catch) condition 。当然,您仍然可以像往常一样具有多个alwaysDoThis();


1
投票

正如cadrel所说,但通过Exception来提供更多反馈,这将在innerException中显示:

catch

...

try
{
    if (AnyConditionTrue)
    {
        MethodWhenTrue();
    }
    else
    {
        HandleError(new Exception("AnyCondition is not true"));
    }
}
catch (Exception ex)
{
    HandleError(ex);
}

1
投票
private void HandleError(Exception ex) {
    throw new ApplicationException("Failure!", ex);
}

//

public class CustomException: Exception
{
     public CustomException(string message)
        : base(message) { }

}

您可以尝试这个

© www.soinside.com 2019 - 2024. All rights reserved.