首页 > 编程语言 >【C++】异常处理 ④ ( 异常接口声明 | 异常接口语法 | 抛出一种类型的异常 | 抛出多种类型的异常 | 抛出任意类型的异常 | 不能抛出异常 | 抛出异常类型错误 | 代码示例 )

【C++】异常处理 ④ ( 异常接口声明 | 异常接口语法 | 抛出一种类型的异常 | 抛出多种类型的异常 | 抛出任意类型的异常 | 不能抛出异常 | 抛出异常类型错误 | 代码示例 )

时间:2023-12-15 10:32:59浏览次数:34  
标签:函数 抛出 接口 HelloWorld fun 异常 throw



文章目录

  • 一、异常接口声明
  • 1、异常接口引入
  • 2、异常接口语法
  • 3、抛出一种类型的异常
  • 4、抛出多种类型的异常
  • 5、抛出任何类型异常 - 不声明异常接口 / 声明 throw(...)
  • 6、不能抛出任何类型异常 - 声明 throw()
  • 7、抛出异常类型错误




博客总结 :

// 1. 不会抛出异常
void fun() throw();    
// 2. 可能会抛出 int 类型的异常   
void fun() throw(int);   
// 3. 可能会抛出 int 或 double 类型的异常 
void fun() throw(int, double);   
// 4. 抛出任意类型异常 
void fun() throw(...);     
// 5. 抛出任意类型异常
void fun();






一、异常接口声明




1、异常接口引入



在 C++ 中 , 异常可以使用 任意 类型 进行表示 , 但是 一般情况下 使用 派生自 标准异常类 std::exception 的 自定义异常类 来表示 异常 ;

" 异常接口 " 用于表示 在 函数中 要抛出的 异常类型 ;



为了 加强 程序的 可读性 , 可维护性 , 推荐将 函数 可能会抛出异常 写入到 函数的 异常接口 中,即 在 函数中国年 列出所有可能抛出的异常类型 ;



2、异常接口语法



在 C++ 语言中 , 异常接口 的声明使用 throw() 关键字 , 用于指定函数要抛出的异常类型 ;

异常接口语法如下 :

函数返回值 函数名(函数参数列表) throw (异常类型1, 异常类型2, ..., 异常类型n)



3、抛出一种类型的异常



抛出一种类型的异常 : 在 void fun() 函数中 , 可能会抛出 int 类型的异常 , 可以使用如下异常接口声明 ;

// 可能会抛出 int 类型的异常
void fun() throw(int) {
	// 函数体
}

代码示例 :

#include "iostream"
using namespace std;

// 1. 在 函数 中 抛出异常
// 异常接口 : 只允许抛出 char 类型异常
void fun() throw(char) {

	cout << "开始抛出 char 类型 异常 " << endl;

	// 抛出一个 char 类型的异常
	throw 'A';
}

int main() {

	// 2. 捕获并处理异常
	try
	{
		// 调用可能产生异常的函数
		fun();
	}
	// 捕获一切未知类型的异常
	catch ( ... )
	{
		cout << "捕获到未知类型异常 ... "<< endl;
	}

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

执行结果 :

【C++】异常处理 ④ ( 异常接口声明 | 异常接口语法 | 抛出一种类型的异常 | 抛出多种类型的异常 | 抛出任意类型的异常 | 不能抛出异常 | 抛出异常类型错误 | 代码示例 )_异常接口声明



4、抛出多种类型的异常



抛出多种类型的异常 : 在 void fun() 函数中 , 可能会抛出多个类型的异常 , 可以使用如下异常接口声明 , 多个异常类型之间使用逗号隔开 ;

// 可能会抛出 int , char , double 类型的异常
void fun() throw(int, char, double) {
	// 函数体
}

代码示例 :

#include "iostream"
using namespace std;

// 1. 在 函数 中 抛出异常
// 异常接口 : 只允许抛出 double, int, char 类型异常
void fun() throw(double, int, char) {

	cout << "开始抛出 char 类型 异常 " << endl;

	// 抛出一个 char 类型的异常
	throw 'A';
}

int main() {

	// 2. 捕获并处理异常
	try
	{
		// 调用可能产生异常的函数
		fun();
	}
	// 捕获一切未知类型的异常
	catch ( ... )
	{
		cout << "捕获到未知类型异常 ... "<< endl;
	}

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

执行结果 :

【C++】异常处理 ④ ( 异常接口声明 | 异常接口语法 | 抛出一种类型的异常 | 抛出多种类型的异常 | 抛出任意类型的异常 | 不能抛出异常 | 抛出异常类型错误 | 代码示例 )_异常接口声明_02



5、抛出任何类型异常 - 不声明异常接口 / 声明 throw(…)



可抛出任何类型异常 的 函数 , 有如下两种声明方式 :

  • 不声明异常接口 : 在 函数 中 , 如果 不声明 异常接口 , 默认可以抛出任何类型的异常 ;
// 1. 在 函数 中 抛出异常
void fun() {

	cout << "开始抛出 char 类型 异常 " << endl;

	// 抛出一个 char 类型的异常
	throw 'A';
}
  • 声明 throw(…) 异常接口 : 如果 函数的 异常接口 声明为 throw(…) , 则可以抛出任意类型的异常 ;
// 在 函数 中 抛出任意类型异常
void fun() throw(...) {

	cout << "开始抛出 char 类型 异常 " << endl;

	// 抛出一个 char 类型的异常
	throw 'A';
}



6、不能抛出任何类型异常 - 声明 throw()



如果禁止函数抛出异常 , 则声明异常接口为 throw() , 如果 在 函数中有抛出异常的行为 , 在编译时会发出警告 ;

// 不允许抛出异常
void fun() throw() {
	// 函数体
}

如果抛出了异常 , 会报错 : " 警告 C4297 “fun”: 假定函数不引发异常,但确实发生了 "

严重性	代码	说明	项目	文件	行	禁止显示状态
警告	C4297	“fun”: 假定函数不引发异常,但确实发生了	HelloWorld	D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Test.cpp	11

代码示例 :

#include "iostream"
using namespace std;

// 1. 在 函数 中 抛出异常
// 异常接口 : 不允许抛出异常
void fun() throw() {

	cout << "开始抛出 char 类型 异常 " << endl;

	// 抛出一个 char 类型的异常
	throw 'A';
}

int main() {

	// 2. 捕获并处理异常
	try
	{
		// 调用可能产生异常的函数
		fun();
	}
	// 捕获一切未知类型的异常
	catch ( ... )
	{
		cout << "捕获到未知类型异常 ... "<< endl;
	}

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

编译警告 :

已启动生成…
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Test.cpp
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Test.cpp(11,1): warning C4297: “fun”: 假定函数不引发异常,但确实发生了
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Test.cpp(11,1): message : 在函数上指定了 __declspec(nothrow)、throw()、noexcept(true)或 noexcept
1>HelloWorld.vcxproj -> D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Debug\HelloWorld.exe
1>已完成生成项目“HelloWorld.vcxproj”的操作。
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

执行结果 :

【C++】异常处理 ④ ( 异常接口声明 | 异常接口语法 | 抛出一种类型的异常 | 抛出多种类型的异常 | 抛出任意类型的异常 | 不能抛出异常 | 抛出异常类型错误 | 代码示例 )_异常处理_03



7、抛出异常类型错误



抛出异常类型错误 : 如果一个函数抛出了它的异常接口声明所不允许抛出的异常 , 会调用 unexpected 函数 , 该函数会调用 terminate 函数 中止程序 , 程序崩溃 ;



下面的 函数中 , 只能抛出 int , double 类型的异常 , 结果在 函数体中 抛出了 char 类型的异常 , 程序会发出警告 ;

// 1. 在 函数 中 抛出异常
void fun() throw( double ) {

	cout << "开始抛出 char 类型 异常 " << endl;

	// 抛出一个 char 类型的异常
	throw 'A';
}

警告内容 : 0x75D5D8A2 处(位于 HelloWorld.exe 中)引发的异常: Microsoft C++ 异常: char,位于内存位置 0x0116F607 处。



代码示例 :

#include "iostream"
using namespace std;

// 1. 在 函数 中 抛出异常
// 异常接口 : 只允许抛出 double 类型异常
void fun() throw( double ) {

	cout << "开始抛出 char 类型 异常 " << endl;

	// 抛出一个 char 类型的异常
	throw 'A';
}

int main() {

	// 2. 捕获并处理异常
	try
	{
		// 调用可能产生异常的函数
		fun();
	}
	// 捕获一切未知类型的异常
	catch ( ... )
	{
		cout << "捕获到未知类型异常 ... "<< endl;
	}

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

编译警告 :

已启动生成…
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Test.cpp
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Test.cpp(6,24): warning C4290: 忽略 C++ 异常规范,但指示函数不是 __declspec(nothrow)
1>HelloWorld.vcxproj -> D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Debug\HelloWorld.exe
1>已完成生成项目“HelloWorld.vcxproj”的操作。
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

执行结果 :

开始抛出 char 类型 异常
捕获到未知类型异常 ...
Press any key to continue . . .

警告信息 :

0x75D5D8A2 处(位于 HelloWorld.exe 中)引发的异常: Microsoft C++ 异常: char,位于内存位置 0x0116F607 处。

【C++】异常处理 ④ ( 异常接口声明 | 异常接口语法 | 抛出一种类型的异常 | 抛出多种类型的异常 | 抛出任意类型的异常 | 不能抛出异常 | 抛出异常类型错误 | 代码示例 )_异常处理_04


标签:函数,抛出,接口,HelloWorld,fun,异常,throw
From: https://blog.51cto.com/u_14202100/8831327

相关文章

  • Eolink Apikit「 零代码」快速发起 RPC 接口自动化测试
    RPC(RemoteProcedureCall)远程过程调用,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC的核心思想是将远程服务抽象成一个接口,客户端通过调用这个接口,就可以实现对远程服务的访问。EolinkApikit支持多协议,RPC、DUBBO、HTTP、REST、Websocket......
  • 【异常】File encoding has not been set, using platform encoding UTF-8, i.e. buil
    From: https://www.cnblogs.com/duanxianyouyang/p/14679926.htmlFileencodinghasnotbeenset,usingplatformencodingUTF-8,i.e.buildisplatformdependent!Usingplatformencoding(UTF-8actually)tocopyfilteredresources,i.e.buildisplatformdepen......
  • fastapi-cdn-host发布了 -- FastAPI接口文档/docs页面空白的问题,现在很好解决了~
    代码地址:https://github.com/waketzheng/fastapi-cdn-host如何安装:pipinstallfastapi-cdn-host使用方法:fromfastapiimportFastAPIfromfastapi_cdn_hostimportmonkey_patch_for_docs_uiapp=FastAPI()monkey_patch_for_docs_ui(app)#增加这行就能解决/docs页面空......
  • 关于找不到指定的模块,异常来自HRESULT:0x8007007E的解决方法
    原文链接:https://www.cnblogs.com/ReBack2010/p/3713851.html上午从公司前辈那里拷贝到的ASP.NET代码,在自己机器上部署的时候发现问题,直接报错,找不到指定的模块,异常来自HRESULT:0x8007007E。并且一大堆警告。在网上百度很多解决方法,归纳如下:1、缺少DLL文件,我用depends打开我的B......
  • 什么是JAVA异常
    1:异常的概念?在Java中,异常(Exception)是指程序执行过程中可能出现的不正常情况或错误。它是一个事件,它会干扰程序的正常执行流程,并可能导致程序出现错误或崩溃。异常在Java中是以对象的形式表示的,这些对象是从java.lang.Throwable类或其子类派生而来。Throwable是异常类层次结构的......
  • 软件测试/人工智能|解决Selenium中的异常问题:“error sending request for url”
    前言在使用Selenium自动化测试时,有时会遇到“errorsendingrequestforurl”这样的异常。这个问题通常与Chrome浏览器驱动程序和网络请求相关。本文让我们来了解如何解决这个问题。问题原因这个异常通常出现在Selenium与Chrome浏览器交互时,可能由于网络请求或Chrome驱动程序......
  • SpringBoot接收日期参数异常
    一、关于接收前端传递的日期参数的问题:前提:Date类型的属性上添加了以下注解:@JsonFormat(timezone="GMT+8",pattern="yyyy-MM-dd")@DateTimeFormat(pattern="yyyy-MM-dd")@JSONField(format="yyyy-MM-dd")1、java.sql.date:空字符串解析报错,正常日期格式字符串没问......
  • 实验6 模板类、文件I/O和异常处理
    实验任务4:1.代码:vector.hpp:1#pragmaonce2#include<iostream>3#include<stdexcept>4usingstd::cout;5usingstd::endl;67template<typenameT>8classVector{9public:10Vector(Tn);11Vector(Tn,Tvalue);12Vector(c......
  • 实验6 模板类、文件I/O和异常处理
    实验任务4Vector.hpp#ifndefVECTOR_HPP#defineVECTOR_HPP#include<iostream>#include<stdexcept>template<typenameT>classVector;template<typenameU>voidoutput(constVector<U>&vec);template<typenameT&......
  • Python——第五章:处理异常try、except、else、finally
    在Python中,try和except语句用于处理异常(错误)。通过使用这两个关键字,你可以编写代码来捕获和处理可能发生的异常,以保持程序的稳定性。try:try代码except错误1as变量1:except1代码except错误2as变量2:except2代码except错误3as变量3:except3......