微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

需要一个强大的错误系统的Win32 gui应用程序

我有一些代码,如下所示:

void MyClass::OnButtonClick() { int retVal = SomeDialog.DoModal(); if(retVal == MYCLASS_ERROR) { MessageBox("Error"...blah ...blah); } else if(retVal == IDOK) // IDOK is returned on clicking the 'OK' button { MessageBox("All is well"...blah ...blah); } }

SomeDialog只是显示一个进度条。 在出现任何错误时,通过调用EndDialog(MYCLASS_ERROR)来自动closures进度条。 只有成功完成后,用户才可以点击“确定”。

MYCLASS_ERROR是enum一个值,它包含各种返回types和状态。

我发现单击SomeDialog确定,错误信息仍然显示! 我挖得更深一点,发现MYCLASS_ERROR = IDOK = 1。

所以我的问题是,我应该如何定义所有这些返回状态,使它不会与任何其他实现的状态相冲突? 意思是,我的函数应该返回不是由其他函数返回的值(或尽可能less的其他函数)。

我想修改我的devise,使所有的function只返回TRUE或FALSE。 但是,这在所有情况下都是不可行的。 我也search了很多答案,到目前为止还没有find答案。

Cython包装使用cl.exe将.c文件编译为.pyd(windows)

C程序打印当前时间

如何在VC ++中复制文件

GDB回溯没有用户input?

对于不同的平台(Linux,Windows等),C ++编译器是多次编写的,这是真的吗?

感谢您的期待!

如何从Windows 10创build者更新上运行的WPF应用程序注册BLE通知

C#控制台应用程序在Windows Server上无法正常工作(在win XP和win 7上工作正常)

如何从C程序在Linux中刷新cpucaching?

在`fwprintf'之后使用'fprintf'时没有输出

信号处理程序中设置标志

有办法解决这个问题,但他们有点难看。

最干净的设计通常是避免与标准的Win32成语相冲突的设计,在Win32的世界中,模式对话框返回一个ID值来指示用户点击它们时按下的按钮(就像消息框一样)。 严格来说,它是传递给EndDialog函数的nResult参数,用于关闭模式对话框。

我建议不要试图用额外的含义来重载这个返回值。 试图这样做只会让你陷入困境(例如,你可能还没有注意到返回值-1意味着创建对话框失败)。

相反,在对话框类中定义一个额外的成员变量,并用它来报告你的附加信息。 成功后,您将从对话框返回IDOK 。 失败( 任何一种失败),返回像IDCANCEL 。 OnButtonClick代码将检查返回值是IDOK还是IDCANCEL 。 如果是IDCANCEL ,则还需要查询添加到对话框的成员变量的值以获取更多信息。

希望这是有道理的。 如果没有,也许这个代码示例将(假设m_errStatus是您添加到CDialog的子类的成员变量):

void MyClass::OnButtonClick() { if (SomeDialog.DoModal() == IDOK) { // Success! // The OK button was clicked,so IDOK was returned. MessageBox("All is well"...blah ...blah); } else { // Failure! // Some error occurred,so IDCANCEL (or any other value) was returned. // Determine what to do Now,based on additional @R_638_4045@ion that the // dialog set upon failure. switch (SomeDialog.m_errStatus) { case MYCLASS_ERROR_1: MessageBox("Error 1 occurred."); break; case MYCLASS_ERROR_2: MessageBox("Error 2 occurred."); break; // etc. } } }

您可以简单地定义您的自定义错误代码,使其不与Windows返回值“冲突”。 当然,你不知道微软什么时候会添加新的返回值,所以这总是会有一点小小的风险。

你可以尝试这样的事情:

enum MYERR { MYERR_FirsT_ERROR = 0x0F000000,/* large and unlikely to be used */ MYERR_SECOND_ERROR,MYERR_THIRD_ERROR,/* and so on */ };

但是,正如上面的Cody Gray所说,我认为最好从DoModal返回一个标准的错误代码,比如IDABORT而不是像这样重载代码。 然后,只需要用户必须显式检索的第二个错误代码,这是您自己的“内部”错误代码

您可以使用枚举而不是宏定义的返回码,并使用名称空间来避免名称冲突。 查看Boost错误处理策略 :

namespace boost { namespace math { namespace policies { enum error_policy_type { throw_on_error = 0,// throw an exception. errno_on_error = 1,// set ::errno & return 0,NaN,infinity or best guess. ignore_error = 2,// return 0,infinity or best guess. user_error = 3 // call a user-defined error handler. }; }}} // namespaces

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐