位置: 编程技术 - 正文

Perl中捕获警告信息、异常信息并写入日志详解(perl调用perl脚本)

编辑:rootadmin

推荐整理分享Perl中捕获警告信息、异常信息并写入日志详解(perl调用perl脚本),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:perl脚本执行命令参数,调用perl脚本,perl 获取参数,perl调用perl脚本,调用perl脚本,perl获取命令行参数,调用perl脚本,perl获取命令行参数,内容如对您有帮助,希望把文章链接给更多的朋友!

虽然建议在每个Perl脚本和模块中开启警告,可是你又不想用户看到Perl发出的警告。

一方面你想在代码前面使用use warnings作为你的安全网,另一方面,通常警告会出现在屏幕上。多数情况下,客户不知道如何处理这些警告。如果幸运的话这些警告仅仅让客户惊讶一下,当然,不幸的是他们尝试着去修复它们... (这里说的不是Perl程序员。)

第三方面,你或许想要保存这些警告供之后分析。

此外,在很多地方还有很多Perl脚本和应用程序没有使用use warnings也没有在#!行中使用-w。加上了use warnings就可能会产生大量的警告。

长远来看,当然是要消除这些警告,但是短期来说呢?

即便是长期计划,你也不能写出完全没有BUG的代码,你也不能确保应用将来永远不会打印出警告信息。

你能么?

你可以在警告打印到屏幕之前捕获它们。

信号Perl有一个叫做%SIG的内建hash表,其中的键是操作系统信号的名字。对应的值是函数(大多数是函数引用),这些函数会在特定的信号触发时被调用。

除了系统提供的标准信号以外,Perl还添加了两个内部“信号”。其中一个是<h__warn__< span="">,它在每次代码调用warn()函数的时候触发。另外一个是__DIE__,它在每次调用die()时触发。

在本文中,我们会看到这些是怎样影响警告信息的。

匿名函数

sub { }是匿名函数,也就是一个只有函数体而没有名字的函数。(在这个例子中函数体也是空的,但是我希望你能明白我的意思。)

捕获警告--不处理

如果添加如下代码:

这实际上表示每次程序的某个地方产生了警告信息时,不做任何处理。基本上,这会隐藏所有的警告。

捕获警告--并转换成异常

You could also write: 你也可以写成:这样会在每次产生警告的时候调用die(),也就是把每个警告转换成异常。

如果你想在异常中包含警告信息,可以这么写:

Perl中捕获警告信息、异常信息并写入日志详解(perl调用perl脚本)

实际的警告信息会作为唯一的参数传递给匿名函数。

捕获警告--并写入日志你可能想在中间做些其他事情:

过滤嘈杂的警告信息,留待后来分析:这里我们假设logger()是你实现的写日志函数。

写日志

假设你的应用程序已经有日志机制。如果没有的话,最好加上。即便你不能添加,你也需要操作系统的内建日志机制。例如Linux的syslog,MS Windows的Event Logger,其它操作系统也有它们内部的日志机制。

在本文的例子里,我们使用一个自制logger()函数来代表这个想法。

捕获并写日志的完整例子

上面的代码会在log.txt文件中添加下面一行:变量$counter和函数count()仅是产生警告示例的一部分。

警告处理函数中的警告信息

__WARN__在其处理函数执行过程中是自动被禁用的。所以在警告处理函数执行过程中产生的(新)警告信息不会导致无限循环。

你可以在perlvar文档中了解到更多细节。Avoid multiple warnings需要注意的是重复的警告信息可能会充斥日志文件。我可以使用一个简单的类似缓存的特性来减少重复警告信息的数量。

可以看到,我们把$counter变量赋值成undef,然后再次调用count()函数来产生同样的警告。

我们也把__WARN__的处理函数替换成一个稍微复杂的版本:在调用logger之前,会检查一下当前字符串是否已经在%WARNShash表中。如果没有的话,会添加它并调用logger()。如果已经有了,就调用return,并不二次记录同样的事件。

你可能回忆起我们在unique values in an array也使用了同样的点子。

local是什么?在上面所有的例子中,我使用local函数?砭植炕?ň?娲?恚┬Ч?Q细窭此担?谡庑├?又形颐敲挥斜匾?饷醋觯?蛭?偕枵庑┐?胧侵鹘疟镜牡谝徊糠帧U庵智榭鱿戮臀匏?搅耍?暇故窃谌?肿饔糜蚶锩妗?/p>

然而,最好是这么用。

local对于在模块中限制(对警告)的改变是很重要的。特别是要发布的模块。如果没有局部化,会影响整个应用程序。limit则会把影响限制在所在的闭合代码块里。

避免使用全局的%WARNS

如果你正在使用Perl 5.或者更新的版本,你可以改写一下代码来替换掉全局变量%WARNS。要这么做的话,需在脚本的开头使用use v5.;,然后在匿名函数内部使用state关键词来声明变量。

Perl基本数组排序方法介绍 本文我们学习如何用Perl对字符串或者数字数组进行排序。Perl有个内置函数叫做sort毫无疑问的可以排序一个数组。其最简单的形式是传递一个数组,它

Perl中怎样从数组中删除某个值? 我不确定undef是否和从数组中消除值有确切的关系,猜测一下,如果我们将undef视为"空",那么会有一些联系。但通常来说,将某些东西赋值为undef和删除

Perl删除前导和拖尾空白(删除左右空格、空白字符) 其它一些编程语言中,有函数ltrim和rtrim分别用于从字符串开头和末尾删除空格和制表符。也有的提供了函数trim来删除字符串两端的空白字符。Perl里没

标签: perl调用perl脚本

本文链接地址:https://www.jiuchutong.com/biancheng/368775.html 转载请保留说明!

上一篇:Perl实现高水线算法(解决多值比较问题方法)

下一篇:Perl基本数组排序方法介绍(perl数组求和)

  • 税收优惠指什么
  • 增值税发票的红章压到金额没有关系吧
  • 企业注销其他应付款可以转入未分配利润吗
  • 工资算管理费用还是生产成本
  • 持有至到期投资是什么意思
  • 固定资产的折旧方法一经选定,不得随意变更
  • 高危行业企业安全费用提取
  • 账簿登记的重要内容
  • 异地预交所得税跨年还能用吗
  • 以前借款没做账现在收回来怎么做账务处理?
  • 处置子公司的收益
  • 应付未付的款项如何税务处理
  • 退预付账款会计分录
  • 培训相关的场地租赁费可以列入职工教育经费税前扣除吗?
  • 退税详细教程
  • 社会组织接受捐赠的资金的使用原则
  • 不涉及税收
  • 哪些情况下超市销售发霉食品免责
  • 个人证券交易结算资金
  • 公司老板垫付的钱怎么做账
  • 股票质押得到的钱怎么算
  • 农作物种植销售
  • 合并报表六大抵消分录通俗理解
  • 投标保证金利息怎么做账
  • 以前年度损益调整借贷方向
  • php公众号
  • PHP:Memcached::deleteMulti()的用法_Memcached类
  • 育空怀特霍斯附近的北极光,加拿大 (© Design Pics/Danita Delimont)
  • 公司购买二手车需要什么手续
  • 售后回购不符合法律规定
  • ui.exe啥意思
  • 向投资者分配现金股利 为什么会导致所有者权益减少?
  • php获取浏览器ua
  • 经典目标检测算法
  • 土地出让金的范围是什么
  • 存根联是自己留着吗
  • 职工教育经费支出比例
  • 增值税申报表第18栏怎么来的
  • 一般纳税人销售自己使用过的物品
  • 办理税务登记需要多久
  • 不动产在建工程领用原材料进项税额可以抵扣吗
  • 收到销售方负数发票可以次月入账吗
  • 固定资产多少钱算固定资产
  • 非成品油发票能做进项吗
  • 上年的原材料发票可以算今年的成本吗
  • 给业务员的佣金怎么做账
  • 业务收入和营业收入关系
  • 企业接受捐赠的固定资产,应增加营业外收入
  • 美国支票上的收款人地址不对怎么办
  • 企业租个人房屋个税代扣代缴
  • 小规模怎么申请核定征收
  • 预收账款最多挂几年
  • 启用账簿时应在账簿上签名或盖章的是
  • mysqld mysql
  • MySQL数据库中把表中的一个字段重命名
  • mysql57服务无法启动,找不到文件夹
  • win7电脑默认打开方式怎么设置
  • xp系统开机checking
  • 远程管理是什么意思
  • macos sierra怎么样
  • OS X Yosemite系统怎么制作u盘安装盘
  • win10预览版和正式版
  • centos7 zsh
  • Cocos2d-x 3.0final 终结者系列教程23CocosStudio UI组件使用大全Cocos2d-x3.2使用
  • jquery1
  • jqgrid动态生成表头
  • 启用opengl的文档窗口
  • linux中date命令详解
  • css怎么控制图片位置
  • nodejs xhr
  • json与对象的区别
  • js数组操作方法
  • js递增数字
  • javascript函数的定义
  • 云办税大厅
  • 江苏税务ukey怎么申请
  • 赣州买二手房限购吗
  • 税务局文化品牌
  • 个人可不可以申请办理租赁性质车辆登记
  • 浙江省增值税专用发票票样
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设