如何检测c#中的异常来源?

时间:2017-10-31 11:58:08

标签: c# exception exception-handling

这是一个在我脑海中提出问题的案例。我有一个包含Convert.ToInt32DateTime.ParseExact方法调用的try块。捕获FormatException时,如何检测抛出异常的方法?

示例代码:

try
{
    //mStrToDate and mStrToInt are the variables that contains desired time and integer values in string format
    DateTime myDate = DateTime.ParseExact(mStrToDate, "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture);
    int mIntVar = Convert.ToInt32(mStrToInt);
}
catch (FormatException exc)
{
    Console.WriteLine(exc.Message);//this line must specify the exception source 
}

3 个答案:

答案 0 :(得分:1)

如果你想这样做,如果你知道你的两个语句都会抛出与你的例子中相同的异常,你应该使用不同的try-catch块

try
{
    DateTime myDate = DateTime.ParseExact(mStrToDate, "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture);
}
catch (FormatException exc)
{
    Console.WriteLine("Exception from DateTime.Parse" + exc.Message);
}

try
{
    int mIntVar = Convert.ToInt32(mStrToInt);
}
catch (FormatException exc)
{
    Console.WriteLine("Exception from Convert.ToInt32 " + exc.Message);
}

您可以编写某种包装器,给定一个调用列表(操作),将在try catch块中执行该操作。这样就可以解决(或改进)在大量调用中干净利落的问题。

其他方法:

从异常消息中挖掘信息

在某些情况下,消息本身可能会有一些信息,但是使用字符串消息的假设部分对您的结果进行分类并推断出来源似乎很臭。

如果确定异常的来源对您很重要,则不应该依赖某些消息行为,这可能会在没有通知的情况下发生变化并破坏您的代码。

从异常堆栈跟踪中挖掘信息

可以使用调用堆栈,它对我来说似乎更可靠但更复杂。但它应该适用于你的情况。

不要使用例外

正如评论中提到的那样,有一种“tryParse”方法,可能会以更好的方式解决您的问题。 如果预期解析有时会失败,那么这不是一个例外。

这是你正常程序流程的一部分,你应该这样对待它(使用try解析和条件逻辑取决于解析的成功)

答案 1 :(得分:1)

try
{
    //mStrToDate and mStrToInt are the variables that contains desired time and integer values in string format
    DateTime myDate = DateTime.ParseExact(mStrToDate, "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture);
    int mIntVar = Convert.ToInt32(mStrToInt);
}
catch (Exception exc)
{
    Console.WriteLine(MethodWhereExceptionOccured(ex));//this line must specify the exception source 
}

获取错误的方法

    public static string MethodWhereExceptionOccured(Exception ex)
    {
        return ex.StackTrace.Split('\r').First().Trim();
    }

答案 2 :(得分:-1)

类似于我的例子,也许对你的问题有用

try
    {
        //mStrToDate and mStrToInt are the variables that contains desired time and integer values in string format
        DateTime myDate = DateTime.ParseExact(mStrToDate, "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture);
        //int mIntVar = Convert.ToInt32(mStrToInt);

        string line = Console.ReadLine();
        if (!int.TryParse(line, out mIntVar ))
        {
            Console.WriteLine("{0} is not an integer", line);
            // Whatever
        }

    }
    catch (FormatException exc)
    {
        Console.WriteLine(exc.Message);//this line must specify the exception source 
    }    

或者你可以这个简单的代码

string line = Console.ReadLine();
int mIntVar ;
if (!int.TryParse(line, out mIntVar ))
{
    throw new FormatException();
}