如何强制执行Catch Block?

时间:2012-02-16 13:46:55

标签: c# exception-handling

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

这里是示例代码:

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

13 个答案:

答案 0 :(得分:27)

我建议不要在else中抛出异常,而是将catch中的代码提取到方法中并从其他方法中调用

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

答案 1 :(得分:22)

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

      //run some code here...

   }

但是就像Yuck所说,我不会推荐这个。你应该退后一步,完成你想要完成的任务。有一种更好的方法(即使用正常的条件流,而不是异常处理)。

答案 2 :(得分:9)

是的,你必须抛出异常:

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

     //run some code here...
  }

答案 3 :(得分:2)

function logo_display()
{
    ?>
        <input type="file" name="logo" /> 
        <?php echo get_option('logo'); ?>
   <?php
}

function handle_logo_upload()
{
    if(!empty($_FILES["demo-file"]["tmp_name"]))
    {
        $urls = wp_handle_upload($_FILES["logo"], array('test_form' => FALSE));
        $temp = $urls["url"];
        return $temp;   
    }

    return $option;
}

function display_theme_panel_fields()
{
    add_settings_section("section", "All Settings", null, "theme-options");

    add_settings_field("logo", "Logo", "logo_display", "theme-options", "section");  

    register_setting("section", "logo", "handle_logo_upload");
}

add_action("admin_init", "display_theme_panel_fields");

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

是的,如果您{1}}尝试throw之外的异常,它将会在catch部分中被捕获。

我不得不问你为什么要这样做呢?异常处理并不意味着可以替代控制流程。

答案 6 :(得分:1)

我认为你想要的是一个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

答案 7 :(得分:1)

正如cadrel所说,但通过异常来提供更多反馈,这将在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);
}

答案 8 :(得分:1)

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

List<string> cc = null;
foreach (string c in cc) {}

答案 9 :(得分:1)

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

}

//

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

您可以尝试

答案 10 :(得分:0)

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

throw new Exception(...);

答案 11 :(得分:0)

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

throw new Exception();

答案 12 :(得分:0)

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

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不会让我强制尝试然后失败。