IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Perl 异常处理之 autodie 和 Try::Tiny

扶凯 2011-06-01 13:44:17 累计浏览 3,716 次
本机暂存

现在要讲的是 audodie 和 Try::Tiny 这是近来看的几本 Perl 书常常提到的,记个笔记。

有时我们常常写多个 open ,然后还要写上多次 die 象下面,读一个文件,然后写一个文件,有时我写的 open 会超过 4 个,要写很多次 die 这时非常麻烦。我们如果直接 use autodie 就直接能解决所有问题。所有的 die 的地方都能自动实现。

open my $fh, '<', $in or die "$!";
open my $fh, '>', $out or die "$!";

加上 autodie 以后就成了

use autodie
open my $fh, '<', $in;
open my $fh, '>', $out;

 有了这个方便多了,有时我们常常不想让程序 die 了后退出,想抓到原因,得使用 eval 然后来检查 $@.象下面这样。 

use autodie;
 
eval { 
    open my $fh, '<', $in; 
    # .....
}
if ($@) {
    # TODO
}
 
eval { 
    open my $fh, '>', $out;
}
 
if ($@){
    # TODO
 
}

还好上次只有二个 open 。。。是不是感觉很痛苦,要是 open 之类会 die 的更加多点的话。另外,有没有发现,只要第一个 open 失败,第二个 if ($@) 永远会失败。因为 $@ 的标记下面也检查同样的变量。这时使用 Try::Tiny 中的 try catch 吧(Python 原生支持)。

 这时使用很方便

use autodie;
use Try::Tiny;
 
try { 
    open my $fh, '<', $in; 
    # .....
    open my $fh, '>', $out;
    # .....
}
cacht {
    print "Error $_\n";
}

 有时我们还可以在这个地方使用 try Catch 做程序流程控制

use autodie;
use Try::Tiny;
 
try { 
     &sub1();
     &sub2();
     &sub3();
 
}
cacht {
     &sub4();
     &sub5();
     &sub6();
}

象上面,只要在 sub1, sub2, sub3 任意一个子函数 die 出来,这个流程就认为出错,就做其它的另一种方案的流程 sub4,sub5,sub6.

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. perl更新/修改/删除文本文件内容 (累计阅读 10,648)
  2. 404~遇见你是最美丽的错误 (累计阅读 9,351)
  3. perl大牛flw传说 (累计阅读 7,714)
  4. AWStats是一个基于Perl的WEB日志分析工具。 (累计阅读 7,175)
  5. perl模块Getopt::Std用法及实例-从命令行读取参数模块 (累计阅读 7,018)
  6. [Perl] Template::Toolkit 模板技术. (累计阅读 6,345)
  7. Perl命令行常见用法及技巧 (累计阅读 5,912)
  8. PHP将死,何以为继? (累计阅读 5,918)
  9. 在perl中连接和使用sqlite做数据存储 (累计阅读 5,813)
  10. Perl 倒行分析文件方法。perl读文本文件,从末尾往前读. (累计阅读 5,609)