try {...}
catch (InvalidDataException ex){...}
可以捕获InvalidDataException
块中引发的try
类的任何实例。
如果try
块可能包含多个可以引发InvalidDataException
类实例的地方,是否可以捕获特定实例?
感谢。
答案 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;