我正在处理的一个应用程序是对大型数据集执行大量并行的背景计算。
负责这些计算的全局任务包含在try-catch块中,以确保应用程序不会出现乱码,以及用于记录目的。
然而,这提出了一个小问题 - 如果发生错误,我知道它发生在哪里,但由于数据量很大,我不知道代码正在处理的具体数据是什么。应用程序运行并行计算这一事实进一步加剧了这一点......这反过来意味着手动调试代码直到我遇到问题的时刻......有问题。
在这种情况下我该怎么办?我可以为每种可能的计算方法编写try-catch块,但也有很多这样的计算方法。是否有更简单的方法?
编辑:
因此提供的答案不是我想要的。
我知道异常中提供了哪些信息。我知道通过查看堆栈跟踪,我可以得到发生错误的确切方法。
问题不在于“错误发生的地方”,而是问题的方法在发生时正在处理的数据。有很多数据,很多方法,只有一个全局尝试捕获。
同样,我可以为每种计算方法编写专用的try-catch块,但这很乏味。我想知道是否有更好的方法来做到这一点。
如果我可以为计算方法添加某种标记,那将是理想的,如果出现错误,它将指示该方法正在处理的数据。但我不知道这是否完全可能。
答案 0 :(得分:2)
一种可能性是使用Exception
属性add additional data到Data
。这样,您就不必为传递调用堆栈所需的每种类型的数据创建自定义异常。
try
{
Calculate(someData);
}
catch(Exception ex)
{
ex.Data.Add("CalculationData", someData)
throw;
}
修改强>
您可以将此与AOP方法结合使用,以确保所有要添加数据的调用(或者如果您选择使用拦截直接记录)都会被截获并正确处理。有关如何完成的信息,请参阅this example。
答案 1 :(得分:0)
我认为您可以使用stackframe对象来查找有关调用方法/函数的更多信息。坚持你的捕获,你可以找出哪种方法给你一个问题
例如
StackTrace stack= new StackTrace(); // get call stack
StackFrame[] stackFrames = stack.GetFrames(); // get method calls (frames)
// write call stack method names
foreach (StackFrame stackFrame in stackFrames)
{
Console.WriteLine(stackFrame.GetMethod().Name); // write method name
}
这将给你所有的m
答案 2 :(得分:0)
查看堆栈跟踪,找出最初发生异常的位置,并在可行的情况下从那里记录。
如果没有使用任何数据创建自己的异常,您可能希望将其传递到堆栈到catch,并捕获您的自定义异常。
查看MSDN: Designing Custom Exceptions
public class NewCustomException : BaseException, ISerializable
{
public NewException()
{
// Add implementation.
}
public NewException(string message)
{
// Add implementation.
}
public NewException(string message, Exception inner)
{
// Add implementation.
}
// This constructor is needed for serialization.
protected NewException(SerializationInfo info, StreamingContext context)
{
// Add implementation.
}
}
答案 3 :(得分:0)
您可以在引发异常的代码中的确切位置暂停执行。这是Visual Studio调试器的一项功能(不能在生产中使用它)。转到菜单Debug>例外,并在新窗口中检查“公共语言运行时异常”。执行现在将在引发异常的时间和地点准确停止,并且您可以检查所有本地数据。