首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分析收集到的异常的策略

分析收集到的异常的策略
EN

Software Engineering用户
提问于 2015-06-19 18:29:42
回答 2查看 851关注 0票数 5

我们希望将错误反馈添加到应用程序中。我看了一下现有的解决方案(例如raygun.io),但是这些工作“在云中”,对我们来说是不行的:

  • 我们的应用程序的大多数安装都是脱机的,因此我们需要将收集到的日志导出到一个文件中,然后将其发送到每个电子邮件中。
  • 由于隐私问题,我不愿意将异常细节上传到第三方服务器。(我们的一些客户可能会杀了我们)。

现在,仅仅记录这些异常并不难。我已经将处理程序附加到AppDomain.UnhandledExceptionAppDomain.FirstChanceException,然后将它们写到一个小型SQLite DB中。

但我的问题是如何最好地分析它们。用手分析它们会花费太多的时间,所以我们至少需要能够将它们分成“水桶”,并按次数排序,等等。

我确实有一些想法,在这里,我比较了老套和消息,等等,但我觉得其他人一定已经做了同样的事情。

你知道对例外进行分类和分组的好策略吗?

EN

回答 2

Software Engineering用户

发布于 2015-06-21 18:04:36

收集异常

收集异常时,要注意两件事:

  • 如果出现异常,在报告异常时,报告机制会抛出另一个异常,会发生什么?最糟糕的情况是开始报告新异常,这可能会触发一个新异常,从而导致在一个循环中抛出数千个新异常。你绝对要避免这种情况。
  • 如果你不能报告异常怎么办?向服务器发送异常可能会失败,因为服务器没有响应。由于缺乏权限,Windows事件的异常存储可能会失败。由于某些原因,将异常保存到本地数据库可能会失败。即使将异常附加到文本文件中也会出现问题:您可能只是空间不足或缺乏权限。通常,您需要有两到三种方法来记录异常,从失败到应该更可靠的方法(比如向服务器报告;数据库;简单文本文件)做退步。一旦阻止异常被正确记录的原始问题得到解决,就必须能够从所有这些源检索异常并仔细分析它们。例如,当网络和数据库都关闭时,如何收集存储在文本文件中的异常?

当涉及到敏感数据时,请确保在将异常发送到第三方服务器(甚至您的服务器)时对它们进行加密,以防止访问堆栈跟踪到未经授权的人员。确保开发人员永远不要在异常消息中包含敏感信息。例如,AccessDeniedException不应该有消息:

验证用户John失败:密码"sihjdfogdhf“无效。

在您收集的信息中,请确保您拥有:

  • 应用程序的确切版本。如果您没有该版本,那么调试异常可能很快就会变成一场噩梦。
  • 有关环境的信息。在Windows上抛出异常的应用程序不一定会在Windows8.1上抛出异常。向FAT32系统抛出异常的应用程序可能在NTFS中运行良好。应用程序的行为可能会很奇怪,因为只剩下不到1MB的磁盘空间,或者因为RAM已经满了,而操作系统不得不交换所有东西,导致响应速度慢,超时异常很多。
  • 标识客户的东西(如果适当的话)。这样就可以与客户联系,询问更多信息。

分析异常

最重要的一步是去复制您收集的异常信息。许多例外将是相似的,但不是完全相同的:关键是要确定它们有多近,并将它们分组。目标是能够将重点放在最常见的异常上:如果一个异常在过去一年中影响了一个用户两次,而一个异常在同一时期内影响了数千名用户,那么第一个异常可能不是您的首要任务。

您可能不会从零开始进行分组;相反,研究您已经收集到的异常,尝试一种分组方法,看看它是如何工作的,然后修改它,直到您得到所需的。分组是很棘手的,因为实际上没有绝对的重复,因为使它成为复制的东西和不复制的东西之间的差距是模糊的。

例如:

  • 如果您收到两个AccessDeniedExceptions报告在登录窗口按钮OnClick事件,一个有关约翰,另一个有关玛丽,这些可以分组,尽管不同的消息字符串。
  • 另一方面,可能有另一个关于Mary的AccessDeniedException,它发生在应用程序的其他地方,不应该与前两个分类。
  • 现在,您的应用程序的不同版本引发了一个AccessDeniedException:堆栈跟踪是不同的,但异常仍然与前两个相同。
  • 等。

分组时,请确保您也保留了个人信息。例如,报告可能告诉我们,在过去的一天里,在4.0.17和4.0.18版本中,用户John、Mary和其他14个人被抛出94次AccessDeniedExceptions,客户给出的堆栈跟踪由1、2、3和4提供。

票数 3
EN

Software Engineering用户

发布于 2015-06-21 12:45:27

对此,我没有详细的解决方案,但我的方法是生成捕获的异常的子类,并存储+分析并实现一些有关异常类型的信息。

代码语言:javascript
复制
public enum ExceptionDanger
{
    Low,
    Middle,
    SecurityCritical
    // And so on
}

现在,我们将其添加到派生异常类中:

代码语言:javascript
复制
public class MonitoredException : Exception
{
    public readonly ExceptionDanger danger;

    public MonitoredException(string message, ExceptionDanger danger)
        : base(message)
    {
        danger = danger;
    }
}

AppDomain.FirstChanceException事件订阅服务器中,我们使用这些信息构建一个新的日志信息(与AppDomain.UnhandledException相同):

代码语言:javascript
复制
static void FirstChanceHandler(object source, FirstChanceExceptionEventArgs e)
{
    var monitoredException = e.Exception as MonitoredException;
    if(monitoredException != null)
    {
        var exDanger = monitoredException.danger;
        var exType = monitoredException.GetType().Name;
        var exTimestamp = DateTime.Now;

        // Build a package like a struct or so and exDanger, exType and exTimestamp to it
    }
}

现在,当服务器接收到包(由exDanger和exType组成)时,数据可以用于存储引发此类错误的数量,如果将用户ID添加到包中,则可以指定哪些用户抛出异常。ExceptionDanger枚举用于排序异常服务器端的重要性。

我希望这能给你一些提示,或者至少给你一个关于如何分类和分析异常的想法。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/287326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档