您想在哪里捕获异常以及为什么?
我很有兴趣看到人们发现将try/catch块放在哪里是有用的,希望可能出现一些通用模式.我将用C++发布我的两个示例答案,但任何语言都可以.
请回答一个位置和原因.谢谢.
architecture error-handling design-patterns exception error-reporting
我正在尝试调试一个庞大的,过时的(大约2001年)PHP Web服务,我遇到了文件打开失败.fopen调用在一个包含的模块中,调用者记录该文件无法打开但没有记录任何原因.
实际打开的代码是:
// Read the file
if (!($fp = @fopen($fileName, 'rb'))) {
$errStr = "Failed to open '{$fileName}' for read.";
break; // try-block
}
Run Code Online (Sandbox Code Playgroud)
我如何才能找出fopen失败的原因?
是否存在您建议在.net中使用的错误报告框架.我需要一些可能性,例如电子邮件报告,以及发送到电子邮件的文件.用户应该可以向报告添加信息,并且还应该可以删除报告文件,即它们是否包含隐私关键数据.还应该有可能采取自动截图.所需的框架还应包括错误报告guis.它应该让我有可能为错误报告创建自己的guis.
我已经使用了log4net,但据我所知,我不可能向用户显示错误报告的gui.
如果有任何建议会很好,
问候,马丁
首先,让我说我理解我所描述的问题是如何以及为什么会发生的.我是计算机科学专业,我理解溢出/下溢和签名/无符号算术.(对于那些不熟悉该主题的人,Apple的安全编码指南会简要讨论整数溢出.)
我的问题是关于在检测到这种错误后报告和恢复,更具体地说是在Objective-C框架的情况下.(我编写和维护CHDataStructures.)我有一些集合类,它们分配用于存储对象的内存并根据需要动态扩展.我还没有看到任何与溢出相关的崩溃,可能是因为我的测试用例主要使用了理智的数据.但是,给定未经验证的值,事情可能会很快爆炸,我想阻止它.
我已经确定了至少两种可能发生这种情况的常见情况:
-initWithCapacity:.简单的部分是检测是否会发生溢出.(例如,在尝试分配length * sizeof(void*)字节之前,我可以检查是否length <= UINT_MAX / sizeof(void*),因为未通过此测试将意味着产品将溢出并可能分配比预期更小的内存区域.在支持它的平台上,checkint.h API是另一种选择.)更难的部分是确定如何优雅地处理它.在第一种情况下,呼叫者可能更好地(或至少在思维模式中)处理故障.第二种情况可能发生在代码中将对象添加到集合中的任何位置,这可能是非常不确定的.
那么,我的问题是:在这种情况下,当整数溢出发生时,"好公民"Objective-C代码如何表现?(理想情况下,由于我的项目是一个与Cocoa中的Foundation基本相同的框架,我想建模它的行为方式以获得最大的"阻抗匹配".我发现的Apple文档中没有提及太多所有这一切.)我认为,无论如何,报告错误是给定的.由于添加对象的API(可能导致方案2)不接受错误参数,我可以做些什么来帮助解决问题,如果有的话?在这种情况下,真正考虑的是什么?如果我能做得更好,我不愿意故意编写容易崩溃的代码......
memory-management error-reporting objective-c integer-overflow
TypeError: 'undefined' is not an object在Jasmine无头webkit中运行测试时,我遇到了一个简单的失败.但是没有提示错误发生在哪个文件或行中.有没有办法获得更清晰的失败信息?
实现简单崩溃/错误报告机制的最佳方法是什么?
细节:我的应用程序是跨平台的(mac/windows/linux)并用Python编写,所以我只需要一些能给我发送少量文本的东西,例如只是一个时间戳和一个追溯(我已经生成并显示在我的错误对话框).
如果它可以简单地通过电子邮件发送它会很好,但是如果不在应用程序中包含smtp服务器的用户名和密码,我就无法想到这样做...我应该在服务器端实现一个简单的Web服务吗?并让我的应用程序发送带有信息的HTTP请求?有更好的想法吗?
作为C#应用程序的作者,我发现如果我可以访问异常或调试日志,用户报告的故障排除问题会更容易.
我已经包含了一个用户可以打开或关闭的本土日志记录机制.我希望用户能够通过互联网提交日志,以便查看日志中的错误.
我曾想过使用SMTPClient或Web服务来发送信息.SMTPClient可能无法正常工作,因为防火墙可能会阻止外发SMTP访问.Web服务是否会出现发送大量数据(可能超过1 MB)的问题?
您建议将应用程序直接向开发人员传输错误报告以供审核的最佳方法是什么?
编辑:澄清:这是一个Windows应用程序,当发生错误时,我想提出一个对话框,要求提交错误.我的问题是关于通过互联网将错误日志从应用程序传输给我(开发人员)的机制.
我目前正在为Windows MSVC++(9.0)应用程序(即异常结构和类型/继承,调用堆栈,错误报告和日志记录等)开发基于异常的错误报告系统.
我现在的问题是:如何正确报告和记录内存不足错误?
当发生此错误时,例如,作为op bad_alloc抛出的错误,new可能存在许多"功能"不可用,主要涉及进一步的存储器分配.通常,我将异常传递给应用程序,如果它已经在lib中抛出,然后使用消息框和错误日志文件来报告和记录它.另一种方式(主要用于服务)是使用Windows事件日志.
我遇到的主要问题是汇编错误消息.
为了提供一些错误信息,我想定义一个静态错误消息(可能是字符串文字,更好的是消息文件中的条目,然后使用FormatMessage)并包含一些运行时信息,如调用堆栈.
这种使用所需的功能/方法也是如此
std::string, std::stringstream, std::ofstream)swprintf_s, fwrite)StackWalk64, MessageBox, FormatMessage, ReportEvent, WriteFile)除了在MSDN上记录,所有这些都在Windows中更多(Win32)或更少(STL)闭源,所以我真的不知道它们在低内存问题下的行为.
为了证明可能存在问题,我写了一个琐碎的小应用程序,引发了一个bad_alloc:
int main()
{
InitErrorReporter();
try
{
for(int i = 0; i < 0xFFFFFFFF; i++)
{
for(int j = 0; j < 0xFFFFFFFF; j++)
{
char* p = new char;
}
}
}catch(bad_alloc& e_b)
{
ReportError(e_b);
}
DeinitErrorReporter();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
抛出两个没有连接调试器的实例(在Release config,VS 2008中),但"没有发生",即没有来自ReportEvent或WriteFile的错误代码我在错误报告中内部使用.然后,使用一个w/o调试器启动一个实例,让他们尝试使用ReportError行上的断点一个接一个地报告错误.对于连接了调试器的实例(正确报告并记录错误,即使使用LocalAlloc没有问题),这也很好!但是taskman展示了一个奇怪的行为,在应用程序退出之前释放了大量内存,我想当抛出异常时.
请考虑可能有多个进程[编辑]和多个线程[/ edit]消耗大量内存,因此释放预先分配的堆空间不是一个安全的解决方案,以避免想要报告的进程的低内存环境错误.
先感谢您!
如何在Sentry中发送特定信息?文档中有事件,但如何正确使用它们以及到底在哪里使用它们(例如:发送带有错误的用户电子邮件)?
Sentry 提供了这个源代码,但是我到底要在哪里使用它呢?:
Sentry.configureScope(
(scope) => scope.user = SentryUser(id: '1234', email: 'jane.doe@example.com'),
);
Run Code Online (Sandbox Code Playgroud)
以及如何在调试模式下停止发送报告?
如果这已经被覆盖了,或者您认为它确实属于wiki,请道歉.
我是一家为生物科学行业生产微阵列印刷机的公司的软件开发人员.我主要通过C++中的GUI开发与各种硬件(气动,液压,步进电机,传感器等)连接,以便将样品吸移并打印到微阵列载玻片上.
在加入公司时,我注意到只要出现与硬件相关的问题,这就会导致整个设置冻结,没有人知道具体问题是什么 - 硬件/软件/误用等等.从那时起我就改进了有些事情通过引入软件超时和异常处理来更好地识别和处理任何硬件相关的问题,例如PLC命令未成功完成,不适当的FPGA响应命令,以及各种其他死锁类型条件等.此外,软件现在将记录具体问题的摘要,通知用户并正常退出线程.此软件未嵌入,只使用串行端口连接.
尽管已经取得了成就,非软件人员仍然不完全了解在这些情况下,他们向我报告的"软件"问题实际上不是软件问题,而是软件报告问题,但不会导致它.不要误会我的意思,没有什么比享受像大量积木一样的软件错误,以及以任何方式提高稳健性的方法.我现在知道这个系统已经足够了,我对这些东西几乎有第六感.
无论我试图解释多少次,都没有真正渗透.他们仍然报告软件问题本质上是硬件问题(最终得到修复).
我想听听其他任何经历过类似指点经验的人以及他们用来处理这些经验的方法.
更新 这里有一些很好的回应,几乎是从同一张赞美诗中唱出来的:更具描述性.我想在硬件出现故障时识别命令并彻底轰炸是第一阶段,但仍然不够.下一阶段将把那些对外行人毫无意义的PLC命令映射到更具启发性的东西."PLC命令M71超时"变为"未能初始化注射器系统.检查是否达到足够的真空"等等......
error-reporting ×10
c# ×2
.net ×1
architecture ×1
bug-tracking ×1
c++ ×1
exception ×1
flutter ×1
fopen ×1
headless ×1
jasmine ×1
objective-c ×1
php ×1
python ×1
qa ×1
sentry ×1
web-services ×1
windows ×1