繁体   English   中英

如何强制执行到 Catch 块?

[英]How Can I Force Execution to the Catch Block?

我想知道可以try..catch强制执行进入catch并在那里运行代码吗?

这里示例代码:

try {
    if (AnyConditionTrue) {
      // run some code
    }
    else {
      // go catch
    }
} catch (Exception) {
    // run some code here...
}

与其在else抛出异常,我建议您将catch的代码提取到一个方法中,然后从 else 中调用它

try
{
    if (AnyConditionTrue)
    {
        MethodWhenTrue();
    }
    else
    {
        HandleError();
    }
}
catch(Exception ex)
{
    HandleError();
}
   try{
      if (AnyConditionTrue){
              //run some code
               }
      else{
              throw new Exception();
          }
   }
   catch(){

      //run some code here...

   }

但就像 Yuck 所说的,我不推荐这个。 您应该退后一步,了解您的设计以及您希望实现的目标。 有一个更好的方法来做到这一点(即使用正常的条件流,而不是异常处理)。

是的,你必须抛出异常:

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

     //run some code here...
  }

一种抛出Exception并跳转到Catch的有效方法,如下所示:

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

}
else{
    throw new Exception();
}

正如cadrel所说,但是通过一个Exception来提供更多的反馈,会在innerException中显示:

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

...

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

如果你想“强迫”尝试捕获,只是故意做一些愚蠢的事情,像这样:

List<string> cc = null;
foreach (string c in cc) {}
public class CustomException: Exception
{
     public CustomException(string message)
        : base(message) { }

}

//

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

你可以试试这个

是的,如果您throw您打算从 try 中catch的异常,它将在 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

最后一个实例,如果发生错误,catch 将执行,但不是alwaysDoThis(); . 当然,您仍然可以像往常一样进行多次catch

轻微的复活,但我想添加一个样本(主要像其他人一样)和一个用例。

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;
    }

就我而言,我有自定义控件 - 一些使用基本 Windows.Forms 控件的控件,但添加了两个布尔值和一个用于跟踪的字符串,并且还自动注册到 Singleton List<T>以便可以正确获取它们无需深入控制容器(它是选项卡形式)。

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

您可以抛出异常以强制捕获

throw new Exception(...);

你为什么要捕捉异常? 为什么不直接在“else”块中运行代码? 如果你必须这样做,就抛出一个新的异常

throw new Exception();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM