如何捕获特定异常实例而不是特定异常类的任何实例?

时间:2017-06-02 23:51:44

标签: c#

try {...}
catch (InvalidDataException ex){...}

可以捕获InvalidDataException块中引发的try类的任何实例。

如果try块可能包含多个可以引发InvalidDataException类实例的地方,是否可以捕获特定实例?

感谢。

4 个答案:

答案 0 :(得分:1)

基本上你可以做类似

的事情
try {...}
catch (InvalidDataException ex)
{
   if (ex == myInstance) {
      // do something
   } else {
       throw;
   }
}

但我会高度建议反对它。您不应该使用例外来控制您的程序流程。

答案 1 :(得分:1)

如果我理解正确 - 你有try块。在try块中,有几个类似的操作可能会抛出InvalidDataException。你想抓住其中的一些而不是抓住其他人。

正如所建议的那样,这可能是一个XY问题,但这里是如何在C#7中完成你所说的话。我不推荐这个,只是字面上回答这个问题。

bool catching = false;
try
{
    catching = true;
    // now exceptions are caught in the catch block.

    catching = false
    // now exceptions aren't caught - they are thrown to the calling method.

}
catch (InvalidDataException ex) when (catching)
{

}

答案 2 :(得分:1)

这是一个简单的例子

[Serializable]
    public class MyException : Exception
    {
        public MyException() { }
        public MyException( string message ) : base( message ) { }
        public MyException( string message, Exception inner ) : base( message, inner ) { }

        protected MyException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context ) : base( info, context ) { }
    }

    class Program {
        static void Main(string[] args) {
            try{
                throw new MyException("Whoops#1");
                //throw new MyException("Fubar#2");
            }catch(MyException myEx){
                string aExMsg = myEx.Message;
                if (aExMsg.Contains("#1")){
                    Console.WriteLine("Whoops was caught");
                }
                if (aExMsg.Contains("#2")){
                    Console.WriteLine("Fubar was caught");
                }
            }catch (Exception ex){
                throw;
            }
            Console.Write("Press <ENTER> to continue...");
            Console.ReadLine();
        }
    }

取消注释行//throw new MyException("Fubar#2");并运行它,catch的{​​{1}}块将捕获错误,检查MyException类的内容,寻找特定的线索,从而可以得到一个实例。

但是,必须注意,这不是处理异常或通过执行此操作控制代码流的好方法。不关心甚至不在路上确定它是什么实例 - 为什么?花了太多时间在那里!只需查看Message部分即可获得线索并将其留在那里。

例外,出于某种原因,当出现错误情况时,有两个结果 - 抓住它们或者悄悄地丢弃(坏!)。

查看上面的示例代码,如果它是某种形式或形式的处理数据的一部分,它是否会影响即将执行的依赖类或方法?

设置几个行程切换标志,以便以这种方式使用即将执行的依赖类或方法,当进一步执行更多代码时;它会看到之前设置的跳闸开关标志,跳过一堆代码,知道之前发生了错误,会使事情变得更糟。

最后,优雅地记录它,通知操作员只是不要在操作员看到的某个弹出窗口或组件中使用“ERROR”一词,它只会给他们一个不需要的恐慌和压力

答案 3 :(得分:0)

您可以使用StackTrace识别它:

var stackTrace = new StackTrace(exception, true);

然后你可以调用一个框架(或一组框架)并使用它的属性:

var methodThatCalled = stackTrace.GetFrames()[0].GetMethod().Name;