捕获参数错误异常

本文介绍如何在Visual C++ 2008中通过自定义无效参数处理函数来捕获并处理参数错误异常。通过示例代码展示了如何设置参数错误处理函数,并演示了当使用sprintf_s等函数时出现参数错误的情况。

// 捕获参数错误异常
// VC 2008
// 编译选项:
//   启用C++异常: /EHa

#include "stdafx.h"
#include "assert.h"
#include <excpt.h>
#include <crtdbg.h>
#include <Dbghelp.h>
#pragma comment(lib, "Dbghelp.lib")

void new_invalid_parameter_handler(
      const wchar_t * expression,
      const wchar_t * function,
      const wchar_t * file,
      unsigned int line,
      uintptr_t pReserved
      )
{
 printf("错误发生/n");
 throw 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
 // 设置参数错误处理函数
  _invalid_parameter_handler old = _set_invalid_parameter_handler(new_invalid_parameter_handler);

  // 禁止_DEBUG时候调试器捕获错误弹出对话框
  // 如果没有这句, 会出现对话框, 选择 "忽略" 可以继续运行
  _CrtSetReportMode(_CRT_ASSERT, 0);


 char ch1[20];
 char ch2[20];
 memset(ch1, 'A', sizeof(ch1));
 memset(ch2, 'B', sizeof(ch2));

 // 出错
 try
 {
  int iLen = sprintf_s(ch1, sizeof(ch1), ch2);
  printf("字符串长度: %d./n", iLen);
 }
 catch (int& iE)
 {
  printf("捕获异常 iE = %d./n", iE);
 }

 printf("程序结束./n");

 _invalid_parameter_handler my = _set_invalid_parameter_handler(old);
 return 0;
}

// 运行输出:
// 错误发生
// 捕获异常 iE = 1.
// 程序结束.

### C++ 中用于处理非法参数错误异常类 在 C++ 中,可以通过自定义异常类来处理非法参数错误。以下是一个示例实现,基于引用中的 `illegalParameterValue` 类[^1]: ```cpp #pragma once #include <iostream> #include <string> using namespace std; class illegalParameterValue { private: string message; public: illegalParameterValue() : message("Illegal parameter value") {} // 默认构造函数 illegalParameterValue(string theMessage) { // 带参数的构造函数 message = theMessage; } void outputMessage() { // 输出错误信息 cout << message << "\n"; } }; ``` 上述代码定义了一个名为 `illegalParameterValue` 的异常类,用于处理非法参数值的情况。该类包含一个私有成员变量 `message` 用于存储错误信息,并提供了两个构造函数:一个是默认构造函数,另一个允许用户传入自定义的错误信息。 当需要抛出此异常时,可以使用 `throw` 关键字,例如: ```cpp void checkValue(int value) { if (value < 0) { throw illegalParameterValue("Value cannot be negative"); // 抛出自定义异常 } } int main() { try { checkValue(-5); // 调用可能抛出异常的函数 } catch (illegalParameterValue& e) { // 捕获异常 e.outputMessage(); // 输出异常信息 } return 0; } ``` 在上面的示例中,`checkValue` 函数检查输入值是否为负数。如果检测到非法参数,则抛出 `illegalParameterValue` 异常。在 `main` 函数中通过 `try-catch` 块捕获并处理异常。 此外,C++ 标准库中也提供了一些预定义的异常类,位于头文件 `<stdexcept>` 中。例如,`invalid_argument` 是一个标准异常类,专门用于处理非法参数的情况[^3]。可以使用如下方式替代自定义异常类: ```cpp #include <stdexcept> // 包含标准异常类 void checkValue(int value) { if (value < 0) { throw std::invalid_argument("Value cannot be negative"); // 使用标准异常 } } ``` 这种方法更加简洁,并且与其他 C++ 程序兼容性更好。 ### 注意事项 在实际开发中,选择自定义异常类还是标准异常类取决于具体需求。如果需要更复杂的错误处理逻辑或特定的错误信息格式,建议使用自定义异常类[^1]。如果仅需简单地报告非法参数错误,标准异常类如 `std::invalid_argument` 是更好的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值