精华内容
下载资源
问答
  • 1.zip 字和表的处理,哪个是开发的趋势?2000告诉你,内含达到12个
  • 传统的医疗服务是一个被动型的服务产业,当参与者有了疾病,或者是有了不舒适的体感,会去体检中心或者医院做检测,用高精度的仪器对身体进行分析,来判断疾病形成的原因给出诊断,并给出相应的治疗建议。...

      传统的医疗服务是一个被动型的服务产业,当参与者有了疾病,或者是有了不舒适的体感,才会去体检中心或者医院做检测,用高精度的仪器对身体进行分析,来判断疾病形成的原因给出诊断,并给出相应的治疗建议。


      但随着


      大数据处理技术的进步,通过智能硬件,在家庭环境中连续采集用户体征数据,不但可以对用户的身体基本指标进行分析,也是对未来健康风险的一个主动预警。


      所以,围绕着体征数据的采集,并且对相应波动规律进行分析和判断,去发现用户未来健康变化可能出现的的风险。在风险形成之前,给予用户改善的建议,减低风险形成的可能性,这是医疗服务在未来发展的趋势。


      但是,为什么在如此多的关注健康类的智能硬件中,胜者寥寥?这是因为在这个领域内存在着两个误区。


      目前的智能硬件都是基于传统体征检测设备改造而来的,而传统的体征检测设备的特点就是单点数据检测和单次数据分析。由于每个检测者的个人情况与所处环境有所差异,当无法约束用户用共性环境的时候,后面的结果就会有千差万别,因此在数据端得出的结论就会出现偏差。


      同时,大数据分析模型,需要建立在足够的理论支持与试验研究的基础上。

      即使有了大量的数据,但模型的建立也要根据不同年龄和不同身体状况的人分别设计。纯粹的关注数值的相关性,也有可能出现偏差。


      所以,针对家庭中不同年龄阶段的人群,不同的需求。可以在家庭普遍环境中,高精度的连续捕捉用户体征数据来提前发现体征状况,并且给予相应改善建议。顺从于医疗领域未来的发展方向,英特尔可以很好的满足用户的大数据时代的需求。


      iHealth可穿戴产品是一个依托于英特尔云计算的用户健康体征监测类产品平台,它覆盖了包括血压监测、血糖监测、心电监测、活动与睡眠追踪、体重管理等多项健康体征监测领域。


      拿血压检测来说。连续血压检测意义是什么?若你被诊断为高血压或高血糖,当你的血压或者血糖数字变化时,你可能只是轻微的感觉自己不太舒服,甚至忽略掉自己的身体变化,但这个忽略可能会给你的健康带来严重的影响。比如说中风,老年性痴呆,肾衰。高血压本身并不致命,但是引起的疾病却足以致命。


      而在远程医疗服务里,这些状况都将得到解决,你的血压血糖数值将被实时记录,并透过可穿戴设备,分享给你的医生,你会马上收到医生的健康建议甚至疾病预警。得到用户一天血压波动,规律的数据。可以提前预警,告诉他引发疾病的风险。

      云端处理可让iHealth监测设备采集的数据更有价值。上传和记录重要的生理信号数据,可以通过共享平台分享给临床和非正式的护理人员。随后,医生会提供解决方案,回传至消费者与其护理团队,给予用户的下一步计划。


      可能对于多数人来讲,很难清楚的了解健康情况下的血压是多少、脂肪率是多少、心率又是多少。如果用户想知道现在是不是健康?未来是不是有风险?这些问题恐怕都需要咨询医生才能得到解答。但随着就医人数的持续增长,以及医院人力不足的困难。对于医院来说,压力与责任愈发强大。所以,如何更加高效的配置已有资源,在保证处理能力的同时给予病人更好的用户体验。最有效的方法之一就是加强医疗数据的挖掘与应用。


      目前,寻常一张CT扫描图像,就含有约150MB的数据;一个基因组序列文件大小约为750MB;标准的病理图的数据量则大得多,要接近5GB。如果将这些数据量乘以人口数量和平均寿命的话,仅一个社区医院累积的数据量,就可达数TB甚至数PB之多,而且其中还富含图像、视频等非结构化数据,更勿论规模更大的医疗机构,甚至是地区医疗主管部门汇集的数据集了。


      医疗行业的大数据虽然量大且繁杂,但其中蕴含的信息价值也多样且丰富,如果能够对其进行有效的存储、处理、查询和分析,小到辅助某个临床医生做出更为科学和准确的诊断和用药决策、或帮助某个医院根据患者潜在需求开发全新个性化服务及自动服务,大到帮助相关研究机构突破医疗方法和药物革新、或支持地区甚至全国医疗行业主管部门优化医疗资源及服务配置。大数据处理能为医疗行业提供前所未有的强力支持。


      所以,如何将海量、复杂的数据的存储、处理和保护成本降至最低,同时还能对此进行实时或准实时的处理、秒级的查询需求响应以及智能、深入的分析,英特尔开放架构的大数据平台为这个问题带来了答案。


      凭借出色的成本优势,以及支持TB-PB级大数据集的分布式存储、实时处理和查询应用,英特尔为医疗行业用户对于大数据的多维度、多层次应用提供强有力的技术平台支撑。同时,英特尔大数据分析平台已经完成了从芯片硬件到数据库管理的全面优化,所以可以有效降低用户在应用软件产品化方案化过程中的工作量和总体成本。


      更为重要的是,英特尔在政府、电信和金融在内的众多行业用户的成功应用,足以证明它已经历了实战的考验。因此,对于医疗行业用户及其面临的大数据应用挑战来说,英特尔的开放架构大数据平台,是针对中国本地医疗行业用户在“医疗大数据解决方案”的最佳选择。

     

    17161623_Rf4Y.jpg



    转载于:https://my.oschina.net/u/1160813/blog/333307

    展开全文
  • 文 | Sherry自从17年Attention is all you need发出,继而18年BERT刷新各大榜单,大型预训练Transformer似乎已经成为自然语言处理的标准基准模型...

    文 | Sherry

    自从17年Attention is all you need发出,继而18年BERT刷新各大榜单,大型预训练Transformer似乎已经成为自然语言处理的标准基准模型,甚至进一步渗透到图像领域。各路大神基于Transformer提出了海量改进方法。这些改变是否对大多数任务有效?谷歌的研究人员对大量的设定在统一的代码库和硬件环境下进行了实验比较。出乎意料的是,大多数“高大上”的改进都不能拓展到所有数据集,反而是一些简单或细节的改动则可以“大力出奇迹”。

    论文题目:
    Do Transformer Modifications Transfer Across Implementations and Applications?

    论文链接:
    https://arxiv.org/pdf/2102.11972.pdf

    Github:
    https://github.com/google-research/google-research/tree/master/transformer_modifications

     另外,我们还建立了自然语言处理、深度学习、推荐系统、知识图谱等方向的讨论组,欢迎大家加入讨论(人数达到上限,添加下方好友手动邀请),注意一定备注喔!

    为什么要比较不同版本的BERT?

    一个真正有效的方法应该可以推广到其他任务。比如说一个改动是针对Transformer编码器的,那么无论下游任务是简单的分类还是NER都应该有效,你不能说我有一把牛刀但它不能用来杀鸡吧。这也是为什么在CNN的各类改进被提出之后图像研究者们总是会用一个最新的版本作为基准实验。然而,即使BERT已经提出了近3年,在实验中大家普遍使用的基准仍然是和一开始的BERT设定非常相似的实验设定。难道最初提出的Transformer是完美的?或者这些魔改都不是本质的,各路大神只是调参让实验刷榜,之后再想办法圆故事发文章。

    于是谷歌大佬们就做了一个实验,把所有针对Transformer的变化放到同一个实验环境下进行比较,看看谁才是最强王者。有了这份实验结果,我们在拿到一个全新的任务的时候,再也不用纠结辣么多高级的Transformer变种到底应该用哪一个好了。

    回顾Transformer结构

    首先我们回顾同时包含编码器-解码器的Transformer结构,输入输出分别是长度为T和U的词序列。

    嵌入词向量

    输入序列经过嵌入词向量的映射矩阵同时加上位置嵌入向量构成了编码器的输入,是正弦绝对位置嵌入。我们分别用表示编码器和解码器的第层的输出,同时也是层的输入。

    编码器

    编码器的每一层从一个多头自注意力网络(Multi-headed Self-attention)开始, 第层第位的第个头的注意力机制由以下方式构成:

    其中Q,K,V是权重矩阵。

    然后我们将所有头得到的向量连接在一起,并且通过残差连接(Residual connection)和层规范化(Layer Normalization):

    这里 LayerNorm具体可以展开为:

    然后多头注意力的输出通过使用ReLU激活函数的全连接网络(dense feedforward network)和残差以及LayerNorm层:

    解码器

    解码器和编码器结构类似,区别在于:

    1. 自注意力机制是因果的--后面的词只能关注到前面的词。通过注意力的下三角掩码(mask)实现。

    2. 解码器中还包含一个交叉注意力机制--在每一层解码器的自注意力机制之后,我们将最后一层编码器的K和V,以及前一层解码器的Q做一次多头注意力。

    解码器的最后一层输出通过一个解码嵌入映射得到最后的输出。

    开启疯狂实验

    本文的实验以T5为基础,全都采用同时包含编码器和解码器的网络。因而所有任务都采用T5中的格式转化为了序列输入输出。不同于最原始的Transformer结构,由于前置LayerNorm层和使用相对位置编码已经得到学术界的广泛认可,实验中默认采用这两个设定。

    下面实验性能结果分为四个部分:

    1. 模型效率:分别用参数量(Params),运算单例所需操作数(Ops),训练速度(Step/s).

    2. 预训练效果:在预训练65,536步(Early loss)之后的困惑度(Perplexity)和训练完全524,288步之后(Final loss)的困惑度。

    3. 在SuperGLUE, XSum 和 WebQuestion上微调后的得分。

    4. 用WMT-14 EnDe从头训练后测试的得分。

    现在让我们看看到底Transformer技术哪家强。

    激活函数

    对于全连接层的激活函数ReLU,我们可以替换成GeLU, Swish, ELU, SeLU, Sigmoid, Softplus和若干GLU(Gated Linear Unit)的变种(ReGLU, GeGLU, LiGLU)。实验结果显示,GeGLU和SwiGLU获得了最大的效果提升。

    正则化

    对于LayerNorm的正则化方法我们可以替换成RMS(root mean square) norm, 或者使用带有正则化效果的Rezero或者Fixup初始化方法。实验结果发现高大上的初始化方法并不起效,反而是RMS--直接把LayerNorm中对均值的偏置去除有更好的效果。

    模型深度

    那么全连接网络的宽度和深度哪个更重要呢?实验中我们保持总参数量不变,探究的关系。从表格中可看出,总体上更深的全连接层更有效。

    词向量嵌入和参数共享

    模型中一共在编码器的输入,解码器的输入和输出3次用到了维的词向量嵌入矩阵,原始Transformer中共享了这三个嵌入矩阵的参数。这里分别实验了只共享两个输入端、只共享解码器两端,或者不共享所有词向量的参数。

    另外,作者还研究了将词向量嵌入分解成低维矩阵的影响:将维的分解为的两个矩阵。在这个实验中固定编码器和解码器输入端共享参数。

    最后,作者还探究了适应性输入嵌入(Adaptive input embeddings)的作用。他们将词根据频率排序,常见词使用更高维的嵌入向量。

    除了词向量嵌入可以共享之外,实验中还分析了共享编码器和解码器其他参数的作用。

    实验表明,参数共享或者是分解词向量嵌入矩阵对模型效果有损伤,但是将编码器和解码器的词向量嵌入解绑可以对效果有略微提升。

    Softmax

    在解码器最后生成序列的时候需要经过Softmax函数,实验中将其替换为其他激活函数:Adaptive softmax利用词表的不均匀分布形成的聚类分级选词从而提高运算速度。Mixture of Softmaxes:则把多个softmax函数通过不同的比例加起来,从而提高softmax部分的表达能力。实验表明Mixture of softmaxes可以提高效果但是比正常的Transformer慢了40%。

    模型结构

    重头戏来了,除了上述的简单改进之外,本文还对多种模型结构的改变进行了在统一环境下的实验,我们在此简略地给出各种模型的介绍,对细节感兴趣的读者可以参考原论文。

    Transparent Attention18年Google AI提出,在编码器深度方向建立带权重的残差连接,从而使促进梯度的流动。

    Evolved Transformer19年,Google Research提出用自动算法搜索最佳Transformer结构。本文也将搜索出的最佳结构加入实验。

    Synthiesizer20年5月,Google Research又提出Synthiesizer: 用学习的方法获得注意力权重。在Synthiesizer(Random)的设定下,他们直接学习注意力权重然后用来做值向量的线性组合。

    Funnel Transformer 则采用类似卷积池化的方式,逐层减少编码器中的序列长度从而更有效地得到句子编码。

    Lightweight and Dynamixc convolutions 使用简化的网络代替Transformer,Lightweight Convolutions的本质可以看作是在深度维度上的卷积网络,只不过每m个频道会共享参数。而Dynamic Convolutions则是核会根据当前步输入改变的卷积网络。

    Sparse Expert TransformersMixture of Experts (MoE) Transformer 和 Switch Transformer 都将全连接层替换成了多个小网络组成的专家们,对于不同的输入,模型会自动选择最终通过哪个网络进行最后的预测。

    Product Key Memory 同样用可选的多个小网络替换全连接层,区别在于这里最后的预测函数是k-近邻的带权平均得到。

    Universal Transofrmer 中为了处理更长的序列,设计了类似序列级别循环网络

    但出乎所有人意料的是,这些花里胡哨的改动很少有显著提高模型效果的。在这些实验中,Synthesizer,对模型效果有显著提高。Switch Transformer, mixture of experts 和 Product Key memory虽然有效但都增加了更多的模型参数。

    总结一下

    文章中尝试了Transformer的许多变种,他们发现这里面最有效的变化反而是那些简单而细节的变化:比如替换成GeGLU激活函数,使用RMS正则化等。而反观模型上的改进,很少的方法可以推广到所有任务中

    但当然,还有许多模型改进本文没有涉及,比如Longformer,Linformer, Performer, Nystromformer等等,那又是针对提升Transformer运算效率的另外一个故事了...

    萌屋作者:Sherry

    本科毕业于复旦数院,转行NLP目前在加拿大滑铁卢大学读CS PhD。经历了从NOIer到学数学再重回CS的转变,却坚信AI的未来需要更多来数学和自认知科学的理论指导。主要关注问答,信息抽取,以及有关深度模型泛化及鲁棒性相关内容。

    作品推荐:

    1. Facebook刷新开放域问答SOTA:模型训模型!Reader当Teacher!

    2. 谷歌、CMU发文:别压榨单模型了!集成+级联上分效率更高!

    3. 无需人工!无需训练!构建知识图谱 BERT一下就行了!

     

    [1] Training Deeper Neural Machine Translation Models with Transparent Attention. (https://arxiv.org/pdf/1808.07561.pdf)

    [2] The Evolved Transformer. (https://arxiv.org/pdf/1901.11117.pdf)

    [3] SYNTHESIZER: RETHINKING SELF-ATTENTION FOR TRANSFORMER MODELS. (https://arxiv.org/pdf/2005.00743.pdf)

    [4] Funnel-Transformer: Filtering out Sequential Redundancy for Efficient Language Processing. (https://arxiv.org/pdf/2006.03236.pdf)

    [5] PAY LESS ATTENTION WITH LIGHTWEIGHT AND DYNAMIC CONVOLUTIONS. (https://arxiv.org/pdf/1901.10430.pdf)

    [6] SWITCH TRANSFORMERS: SCALING TO TRILLION PARAMETER MODELS WITH SIMPLE AND EFFICIENT SPARSITY. (https://arxiv.org/pdf/2101.03961.pdf)

    [7] Large Memory Layers with Product Keys. (https://arxiv.org/pdf/1907.05242.pdf)

    [8] Universal transformers. (https://arxiv.org/pdf/1807.03819.pdf)

    [9] GLU Variants Improve Transformer. (https://arxiv.org/pdf/2002.05202.pdf)

    - END -



    谷歌 ICLR 2020 | 向量化召回也需要『预训练』

    2021-04-14

    复述(paraphrasing):一种简单暴力的预训练方式

    2021-04-09

    推荐系统技术演进趋势:召回篇

    2021-04-06

    收藏 !机器学习基础图表

    2021-03-30

    展开全文
  • 在本文中,笔者也使用了猫眼的接口来获取数据,方便处理,数据量也比较多。 有关接口,大家可以自己去猫眼的网站上看,也可以使用如下地址: http://m.maoyan.com/mmdb/comments/movie/248172.json?_v_=yes&...

    01 抓取数据

    业界朋友们,在电影分析中,使用猫眼的数据比较多。在本文中,笔者也使用了猫眼的接口来获取数据,方便处理,数据量也比较多。

    有关接口,大家可以自己去猫眼的网站上看,也可以使用如下地址:

    http://m.maoyan.com/mmdb/comments/movie/248172.json?_v_=yes&offset=20&startTime=2019-04-24%2002:56:46

    在 Python 中,使用 Request 可以很方便地发送请求,拿到接口返回的 JSON 数据,来看代码:

     

    请求返回的是一个 JSON 数据,拿到我们想要的评论原始数据,并将数据存储在数据库中:

     

    经过大概两个小时,终于从猫眼爬取了大约 9 万条数据。数据库文件已经超过了 100M 了。

    02 数据清洗

    因为在上面抓取下来的数据,直接进行了原数据的存储,没有进行数据的解析处理。接口中包含了很多数据,有用户信息、评论信息等。本次分析,只使用了部分数据,所以需要将用到的相关数据清洗出来:

     

    通过 JSON 库将原始数据解析出来,将我们需要的信息存储到新的数据表中。

    03 数据分析

    因为没有任何一个平台能够拿到用户的购票数据,我们只能从评论的数据中,以小见大,从这些数据中,分析出一些走势。 在评论数据中,我们能看到评论用户所在的城市。将数据所在的位置解析,划分到各对应的行政省,可以看到每个省评论数量,见下图(颜色越红,用户评论数量越多):

    城市

    从图中可以看到, 上海、广州、四川用户的数量显然要比其他城市的用户数量要多得多。再来看一下代码:

     

    漫威电影一直深受中国朋友们喜欢的高分电影。豆瓣评分 8.7 分,那我们的评论用户中,又是一个什么样的趋势呢?见下图:

    评分数

    从图中可以看到,评 5 分的数量远高于其他评分,可见中国的观众朋友确实喜欢漫威的科幻电影。

    复联从 1 开始便是漫威宇宙各路超级英雄的集结,到现在的第 4 部,更是全英雄的汇聚。那么,在这之中,哪位英雄人物更受观众欢迎?先看代码:

     

    运行结果如下图,可以看到钢铁侠钢铁侠是实至名归的 C 位,不仅电影在电影中是,在评论区仍然也是实至名归的 C 位,甚至于远超美队、寡姐和雷神:

    英雄评论次数

    从以上观众分布和评分的数据可以看到,这一部剧,观众朋友还是非常地喜欢。前面,从猫眼拿到了观众的评论数据。现在,笔者将通过 Jieba 把评论进行分词,然后通过 Wordcloud 制作词云,来看看,观众朋友们对《复联》的整体评价:

    词云分析

    可以看到,灭霸和钢铁侠出现的词频比其他英雄要高很多。这是否表示,这部剧的主角就是他们两个呢?

    细心的朋友应该发现了,钢铁侠、灭霸的数量在词云和评论数量里面不一致。原因在于,评论数量就按评论条数来统计的,而词云中,使用的是词频,同一条评论中,多次出现会多次统计。所以,灭霸出现的次数居然高于了钢铁侠。

    最后,再来分析一下钢铁侠与灭霸的情感分析,先上代码:

     

    此处,使用 SnowNLP 来进行情感分析。

    情感分析,又称为意见挖掘、倾向性分析等。简单而言,是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。

    灭霸

    钢铁侠

    从图中看到, 钢铁侠的正向情感要比灭霸的正向情感要高,反派角色就是容易被人抗拒。

    最最后,从《银河护卫队》时期穿越而来的灭霸在最后分钟变成了粉末消散而去,这也给我们程序员一个警钟:

    重构代码,改善设计,降低系统复杂度,这样做很好。但是,一定要保证系统的稳定运行,不留安全隐患,不然,早晚会丢掉自己的工作。

    展开全文
  • 七、异常处理

    2021-03-05 09:25:44
    异常处理机制(exception handing facility):身为设计者我们不知道某个可能发生的问题对于整个程序的危害程度究竟如何,只有该函数的用户知道问题的严重性。因此我们的职责就是通知用户,告诉他发生了什么事,...
    • 异常处理机制(exception handing facility):身为设计者我们不知道某个可能发生的问题对于整个程序的危害程度究竟如何,只有该函数的用户才知道问题的严重性。因此我们的职责就是通知用户,告诉他发生了什么事,异常处理机制便是用来完成通知任务的。
    • 异常处理机制包括:异常的鉴定与发出 + 异常的处理方式。
    • 异常出现后,正常程序的执行便被暂停(suspended),同时异常处理机制开始搜索程序中有能力处理这一异常的地点。异常被处理完毕后,程序的执行便会继续(resume),从异常处理点接着执行下去。
    • 抛出(thrown)异常:throw表达式看起来像函数调用,异常是某种对象,大部分时候都属于特定的异常类(也许形成一个继承体系)。
    inline void Triangular_iterator::
    check_integrity()
    {
    	if(_index >= Triangular::_max_elems)
    		throw iterator_overflow(_index, Triangular::_max_elems);
    		
    		if(_index > Triangular::_elems.size())
    			Triangular::gen_elements(_index + 1);
    }
    
    //iterator_overflow类的定义
    class iterator_overflow{
    public:
    	iterator_overflow(int index, int max)
    		: _index(index), _max(max) {}
    	int index() {return _index;}
    	int max() 	{return _max;}
    	
    	void what_happened(ostream &os = cerr) {
    		os << "Internal error: current index "
    		   << _index << " exceeds maximum bound: "
    		   << _max;	
    	}
    	
    private:
    	int _index;
    	int _max;
    };
    
    • 上述throw表达式会直接调用拥有两个参数的constructor。也可以明确指出被抛出对象的名称:
    if(_index > Triangular::_max_elems)
    {
    	iterator_overflow ex(_index, Triangular::_max_elems);
    	throw ex;
    }
    
    • 捕获(catch)异常:利用单条或一连串的catch子句来捕获。catch子句由三部分组成:关键字catch + 小括号内的一个类型对象 + 大括号内的一组语句(用来处理异常):
    catch(iterator_overflow &iof)
    {
    	iof.what_happened(log_file);
    }
    
    • 异常对象的类型会被拿来逐一地和每个catch子句比对。如果类型符合,那么该子句的内容便会被执行。在通过所有的catch子句后,由正常程序重新接手。

    如上所示,通过iof这个异常对象,调用异常类中的成员函数what_happened().

    • 当无法完成异常的完整处理时,或许需要重新抛出(rethrow)异常,以寻求其他catch子句的协助:
    catch(iterator_overflow &iof)
    {
    	log_message( iof.what_happened() );
    	
    	//重新抛出异常,令另一个catch子句接手处理
    	throw;
    }
    

    重新抛出时,只需写下关键字throw即可,它只可能出现于catch子句中,将捕获的异常对象再一次抛出,并由另一个类型吻合的catch子句接手处理。

    • 如果我们想要捕获任何类型的异常,可以使用一网打尽(catch-all)的方式:
    //在异常声明部分指定省略号
    catch(...)
    {
    	log_message( "exception of unknown type" );
    	//清理(clean up)然后退出...
    }
    
    • 提炼异常:catch子句应该和try块相应而生。try块以关键字try作为开始,后接大括号内的一连串程序语句。catch子句放在try块末尾,表示如果try块内有任何异常发生,便由接下来的catch子句加以处理。
    • 函数抛出异常后,异常处理机制便开始查看,异常由何处抛出,并判断是否位于try块内?如果是,就检验相应的catch子句,看它是否具备处理此异常的能力,如果有,这个异常便被处理,而程序也就继续执行下去(从被执行的catch子句之后的第一行语句开始)。
    • 若不在try块内,则异常处理机制终究该函数的执行权,其剩余内容不会被执行。但异常处理机制会继续在该函数的调用端搜寻类型吻合的catch子句。
    • 如果函数调用链不断被解开,一直到main()还是找不到合适的catch子句,C++规定,每个异常都应该被处理,于是调用标准库提供的terminate()——其默认行为是中断整个程序的执行。
    • 如果某一语句可能引发异常,而它不位于try块内,那么该异常一定不会在此函数内被捕获处理。
    • 并非每个函数都必须处理每一个可能发生的异常。
    • 当函数的try块发生异常,但并没有相应的catch子句将它捕获,该函数便会被中断,由异常处理机制接管,沿着函数调用链一路回溯,搜寻符合条件的catch子句。
    • 面对任何一个被抛出的C++异常,你都可以在程序某处找到一个相应的throw表达式。
    • 不能把C++异常和segmentation fault或是bus error这类硬件异常混淆在一起。
    • 下列函数错误,无法保证函数执行之初所分配的资源最终一定会被释放掉。如果process()抛出异常,则其后两条释放资源的语句都不会被执行。
    extern Mutex m;
    void f()
    {
    	//请求资源
    	int *p = new int;
    	m.acquire();
    	
    	process(p);
    	
    	//释放资源
    	m.release();
    	delete p;
    }
    
    • 可以加入try块和相应的catch子句,catch子句捕获所有异常、释放资源、再将异常重新抛出。(但用以释放资源的程序代码得出现两次(catch和catch后都要有))
    • 资源管理(resource management):在初始化阶段即进行资源请求。
    • 对对象而言,初始化操作发生于constructor内,资源的请求也应该在constructor内完成。资源的释放则应该在destructor内完成。
    #include <memory>
    void f()
    {
    	auto_ptr<int> p(new int);
    	MutexLock ml(m);
    	process(p);
    	//p和ml的destructor会在此处被调用
    }
    
    • 在异常处理机制终结某个函数前,C++保证,函数中的所有局部对象的destructor都会被调用!
    • auto_ptr是标准库提供的class template,它会自动删除通过new表达式分配的对象,使用之前要包含头文件#include <memory>,其中重载了derefrence(*)运算符和arrow(->)运算符,使得可以像使用一般指针一样使用auto_ptr对象。
    auto_ptr<string> aps(new string("hello"));
    string *ps = new string("hello");
    	
    if((aps -> size() == ps -> size()) && (*aps == *ps))
    	//true
    
    • 如果new表达式无法从程序的空闲空间分配到足够的内存,会抛出bad_alloc异常对象。
    • 如果要抑制不让bad_alloc异常被抛出,可以ptext = new (nothrow) vector<string>;,这样如果new操作失败,会返回0。任何人使用ptext之前都应该先检验它是否为0.
    • catch(bad_alloc)并未声明出任何对象,只对捕获到的异常类型感兴趣,并没有打算在catch子句中实际操作该对象。
    • 标准库定义了一套异常类体系,根部为抽象基类exceptionexception声明有一个what()虚函数,返回const char *来表示被抛出异常的文字描述。#include <exception>
    • 可以将自己编写的iterator_overflow融入标准的exception类体系中,必须提供自己的what(),因此可以被任何打算捕获抽象基类exception的程序所捕获。
    //捕获exception的所有派生类
    catch( const exception &ex)
    {
    	cerr << ex.what() << endl;
    }
    
    • 以下便是iterator_overflowwhat()实现方式。
    //运用ostringstream对象对输出信息进行格式化
    #include <sstream>
    #include <string>
    
    const char* iterator_overflow::
    what() const
    {
    	ostringstream ex_msg;
    	static string msg;
    	
    	//将输出信息写到内存中的 ostringstream对象之中
    	//将整数值转为字符串表示
    	
    	ex_msg << "Internal error: current index "
    		   << _index << "exceeds maximum bound: "
    		   << _max;
    	
    	//萃取出string对象
    	msg = ex_msg.str();
    	
    	//萃取出const char*表达式
    	return msg.c_str(); 
    } 
    
    • ostringstream 类提供内存内的输出操作,输出到一个string对象上。能自动将_index_max这类数值对象转换为相应的字符串而不必考虑储存空间、转换算法等问题#include <sstream>
    • ostringstream所提供的一个member functionstr()能将与对象对应的那个string对象返回。
    • string类提供的转换函数c_str()返回一个C-style字符串。
    • iostream库也提供了相应的istringstream类。将非字符串数据的字符串表示转换为其实际类型。
    • ifstream constructor接受的参数是const char*而非string
    展开全文
  • 配置处理结果

    2017-09-13 15:13:22
    1.Struts2的两种结果:  ...简单的说,结果配置是告诉Struts2框架:当Action处理结束时,系统下一步做什么,系统下一步应该调用哪个物理视图资源来显示处理结果。 局部结果:将作为元素的子
  • 详解IOS图片压缩处理

    2020-09-01 22:42:57
    在日常IOS开发中,感觉图片尺寸太大,想压缩成小一点像素的。那么该如何做呢?本文通过“压缩”两个概念及实例来告诉大家如何进行图片压缩处理才是最好的。
  • Python异常处理

    2019-09-20 07:50:49
    异常总是最可靠的的朋友,它会告诉你为什么出问题、哪里出了问题。 我们来看看Python这门语言的异常处理机制是怎么样的。这里还有一篇介绍“Python常见异常”的文章。 键盘事件 我们总爱写一个死循环,但是,...
  • 那么有些时候如果我们知道编码方式,那么解码自然很好搞,例如输出的contentType会告诉浏览器我输出的内容是什么编码格式的,否则浏览器会用一个当前默认的字符集编码来处理;本文要将一些java如何处理没有带正常...
  • 处理IIS映射之我见

    2018-08-03 11:04:00
    在上网查了好多资料都说的特别模糊,要不然就是只告诉你怎么配置不告诉你是干嘛的,要不然就是说的特别不清楚不知道他写的是啥,后来查了微软官方文档(真坑啊还是得自己看文档)搞明白,下面是我对IIS处理映射的...
  • 这一章并不是给出处理异常的细节,而是从大方向上去告诉我们怎么处理异常会使得代码看起来可控制。 使用异常而非返回码 为什么不使用异常码,且不说你需要定义一个Constant类或者Enum类来保存异常码类别,调用完...
  • 字符串处理

    2016-10-13 17:34:42
    \n表示换行,即光标移到下一行,不会到行首的,只是在DOS等操作系统里会将\n自动转换成\r\n回到下一行的行首的。 \0是十进制表示法表示的ascii为0的字符,一般是用来作为字符串结束标志的,我们用“”定义字符串...
  • async模块的异步处理

    2016-04-24 22:55:50
    ………这样的代码node并不会等待fs.open将文件打开准备好数据之后往下执行,而是直接一扫而过,只是注册了一个事件,告诉系统等fs.open实际工作完之后调用回调函数继续处理,所以fs.read(file,buf
  • 点击上方“程序猿技术大咖”,关注并选择“设为星标”回复“加群”获取入群讨论资格!工作在划水,被领导发现了▼▼▼测试告诉我说有一个Bug,但我不知道处理▼▼▼当他们告诉我这是一个很容易修复...
  • 你读过的博客告诉你要辞职,创业是未来的潮流。社会把工作变成了敌人。我们抱怨我们的工作,指责我们的工作是问题所在,并且迫切希望摆脱工作,以减轻我们的焦虑。 我有个消息给你,你的工作不是问题…你是。 1 ...
  • 关于图像处理方面的收获: 五月中旬的时候接了个细胞检测的活,要求识别白细胞、红细胞、脂肪球、霉菌几种 细胞,大致看了客户发给我显微镜上的图片,发现能做,于是就接了下来,客户告诉 我最终的程序要是C++的...
  • Java的时间处理

    2008-04-06 22:43:00
    Java的时间处理(续)学习在java中计算基本的时间段概述如果你知道怎样在java中使用日期,那么使用时间和它不多一样简单。这篇文章告诉你怎样把他们的差别联系起来。Robert Nielsen还告诉你怎样使用java来计算抵达...
  • 自诉

    千次阅读 2012-07-30 11:07:15
    自诉是公诉的对称,指被害人或者其法定代理人、近亲属为追究被告人的刑事责任,向人民法院提起诉讼,由人民法院直接受理的案件。 ...所谓告诉才处理的案件,指由被害人及其法定代理人、近亲属等提
  • 想着原来是没有写后台代码,询问一清同学的时候,他告诉我能够利用ASP.NET的一般处理程序。 我果然是菜鸟刚開始学习的人,由于我还没有接触过一般处理程序。 什么是一般处理程序: 一般处...
  • java处理文件之乱码

    2018-10-03 22:40:52
    这个问题经常遇到,这里告诉大家问题的根本,也是解决问题的根本。一个文件流必须用和它的编码类型完全一致的输入流去接收不会产生乱码。如果不说明编码类型,java默认都是按照iso-8859-1进行编码的。而我们的页面...
  • 我们最近对账的时候发现,有...原来用的weblogic服务器就没有这样的问题,因为在重启的时候,weblogic服务器会一直等待所有的请求都返回,所有的事务都处理好了,会真正重启。但是jetty服务器告诉他重启,什么都不等
  •  二、自诉案件的范围有哪些 根据《中华人民共和国》第一百七十条规定,自诉案件包括下列案件: (一)告诉才处理的案件; (二)被害人有证据证明的轻微刑事案件; 范本 刑事自诉案件授权委托书 委托人所律师 为 ...
  • 很着急,又怕别人利用自己的网站在互联网上做违法的事情,一时间不知道该怎么处理才好,如何才能让对方不要出现在互联网上面,接下来南帝seo就告诉你如果在百度搜索引擎上面看到自家网站被镜像了,该如何处理。...
  • (2020)指代消解ontoNotes_Release_5.0处理详细流程

    千次阅读 热门讨论 2020-04-22 20:52:42
    最近在做指代消解的任务,目前才处理完数据部分,确实有些繁琐,因此记录 准备用spanbert做的指代消解,所以该代码里的.sh文件: github代码 数据获取 获取数据部分也需要耐心,参考以下博客(可以搭配看) ...
  • 凌晨四点被公司的监控告警叫醒了,告警的原因是生产环境跑批任务发生故障。即刻起床处理故障,但还是花了不少时间解决。这次故障是一次数据校验的跑批任务,校验前面跑批任务的数据是否正确。幸运的是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 800
精华内容 320
关键字:

告诉才处理