📄 ch12_03.htm
字号:
<HTML><HEAD><TITLE>Recipe 12.2. Trapping Errors in require or use (Perl Cookbook)</TITLE><METANAME="DC.title"CONTENT="Perl Cookbook"><METANAME="DC.creator"CONTENT="Tom Christiansen & Nathan Torkington"><METANAME="DC.publisher"CONTENT="O'Reilly & Associates, Inc."><METANAME="DC.date"CONTENT="1999-07-02T01:41:23Z"><METANAME="DC.type"CONTENT="Text.Monograph"><METANAME="DC.format"CONTENT="text/html"SCHEME="MIME"><METANAME="DC.source"CONTENT="1-56592-243-3"SCHEME="ISBN"><METANAME="DC.language"CONTENT="en-US"><METANAME="generator"CONTENT="Jade 1.1/O'Reilly DocBook 3.0 to HTML 4.0"><LINKREV="made"HREF="mailto:online-books@oreilly.com"TITLE="Online Books Comments"><LINKREL="up"HREF="ch12_01.htm"TITLE="12. Packages, Libraries, and Modules"><LINKREL="prev"HREF="ch12_02.htm"TITLE="12.1. Defining a Module's Interface"><LINKREL="next"HREF="ch12_04.htm"TITLE="12.3. Delaying use Until Run Time"></HEAD><BODYBGCOLOR="#FFFFFF"><img alt="Book Home" border="0" src="gifs/smbanner.gif" usemap="#banner-map" /><map name="banner-map"><area shape="rect" coords="1,-2,616,66" href="index.htm" alt="Perl Cookbook"><area shape="rect" coords="629,-11,726,25" href="jobjects/fsearch.htm" alt="Search this book" /></map><div class="navbar"><p><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch12_02.htm"TITLE="12.1. Defining a Module's Interface"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 12.1. Defining a Module's Interface"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1"><ACLASS="chapter"REL="up"HREF="ch12_01.htm"TITLE="12. Packages, Libraries, and Modules"></A></FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch12_04.htm"TITLE="12.3. Delaying use Until Run Time"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 12.3. Delaying use Until Run Time"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch12-25543">12.2. Trapping Errors in require or use</A></H2><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch12-pgfId-412">Problem<ACLASS="indexterm"NAME="ch12-idx-1000005178-0"></A><ACLASS="indexterm"NAME="ch12-idx-1000005178-1"></A><ACLASS="indexterm"NAME="ch12-idx-1000005178-2"></A><ACLASS="indexterm"NAME="ch12-idx-1000005178-3"></A></A></H3><PCLASS="para">You need to load in a module that might not be present on your system. This normally results in a fatal exception. You want to detect and trap these failures.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch12-pgfId-418">Solution</A></H3><PCLASS="para">Wrap the <CODECLASS="literal">require</CODE> or <CODECLASS="literal">use</CODE> in an <CODECLASS="literal">eval</CODE><ACLASS="indexterm"NAME="ch12-idx-1000005179-0"></A>, and wrap the <CODECLASS="literal">eval</CODE> in a BEGIN block:</P><PRECLASS="programlisting"># no importBEGIN { unless (eval "require $mod") { warn "couldn't load $mod: $@"; }}# imports into current packageBEGIN { unless (eval "use $mod") { warn "couldn't load $mod: $@"; }}</PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch12-pgfId-450">Discussion</A></H3><PCLASS="para">You usually want a program to fail if it tries to load a module that is missing or doesn't compile. Sometimes, though, you'd like to recover from that error, perhaps trying an alternative module instead. As with any other exception, you insulate yourself from compilation errors with an <CODECLASS="literal">eval</CODE>.</P><PCLASS="para">You don't want to use <CODECLASS="literal">eval</CODE> <CODECLASS="literal">{</CODE> <CODECLASS="literal">BLOCK</CODE> <CODECLASS="literal">}</CODE>, because this only traps run-time exceptions and <CODECLASS="literal">use</CODE> is a compile-time event. Instead, you must use <CODECLASS="literal">eval</CODE> <CODECLASS="literal">"string"</CODE>, to catch compile-time problems as well. Remember, <CODECLASS="literal">require</CODE> on a bareword has a slightly different meaning than <CODECLASS="literal">require</CODE> on a variable. It adds a <CODECLASS="literal">".pm"</CODE> and translates double-colons into your operating system's path separators, canonically <CODECLASS="literal">/</CODE> (as in URLs), but sometimes <CODECLASS="literal">\</CODE>, <CODECLASS="literal">:</CODE>, or even <CODECLASS="literal">.</CODE> on some systems.</P><PCLASS="para">If you need to try several modules in succession, stopping at the first one that works, you could do something like this:</P><PRECLASS="programlisting">BEGIN { my($found, @DBs, $mod); $found = 0; @DBs = qw(Giant::Eenie Giant::Meanie Mouse::Mynie Moe); for $mod (@DBs) { if (eval "require $mod") { $mod-><CODECLASS="literal">import</CODE>(); # if needed $found = 1; last; } } die "None of @DBs loaded" unless $found;}</PRE><PCLASS="para">We wrap the <CODECLASS="literal">eval</CODE> in a BEGIN block to ensure the module-loading happens at compile time instead of run time.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch12-pgfId-1000005607">See Also</A></H3><PCLASS="para">The <ACLASS="olink"HREF="../prog/ch03_032.htm"><CODECLASS="literal">eval</CODE></A>, <ACLASS="olink"HREF="../prog/ch03_027.htm"><CODECLASS="literal">die</CODE></A>, <ACLASS="olink"HREF="../prog/ch03_185.htm"><CODECLASS="literal">use</CODE></A>, and <ACLASS="olink"HREF="../prog/ch03_123.htm"><CODECLASS="literal">require</CODE></A> functions in <ACLASS="olink"HREF="../prog/ch03_01.htm">Chapter 3</A> of <ACLASS="citetitle"HREF="../prog/index.htm"TITLE="Programming Perl"><CITECLASS="citetitle">Programming Perl</CITE></A> and in <ICLASS="filename">perlfunc</I> (1); <ACLASS="xref"HREF="ch10_13.htm"TITLE="Handling Exceptions">Recipe 10.12</A>; <ACLASS="xref"HREF="ch12_04.htm"TITLE="Delaying use Until Run Time">Recipe 12.3</A></P></DIV></DIV><DIVCLASS="htmlnav"><P></P><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch12_02.htm"TITLE="12.1. Defining a Module's Interface"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 12.1. Defining a Module's Interface"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="book"HREF="index.htm"TITLE="Perl Cookbook"><IMGSRC="../gifs/txthome.gif"ALT="Perl Cookbook"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch12_04.htm"TITLE="12.3. Delaying use Until Run Time"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 12.3. Delaying use Until Run Time"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">12.1. Defining a Module's Interface</TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="index"HREF="index/index.htm"TITLE="Book Index"><IMGSRC="../gifs/index.gif"ALT="Book Index"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228">12.3. Delaying use Until Run Time</TD></TR></TABLE><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><FONTSIZE="-1"></DIV<!-- LIBRARY NAV BAR --> <img src="../gifs/smnavbar.gif" usemap="#library-map" border="0" alt="Library Navigation Links"><p> <a href="copyrght.htm">Copyright © 2002</a> O'Reilly & Associates. All rights reserved.</font> </p> <map name="library-map"> <area shape="rect" coords="1,0,85,94" href="../index.htm"><area shape="rect" coords="86,1,178,103" href="../lwp/index.htm"><area shape="rect" coords="180,0,265,103" href="../lperl/index.htm"><area shape="rect" coords="267,0,353,105" href="../perlnut/index.htm"><area shape="rect" coords="354,1,446,115" href="../prog/index.htm"><area shape="rect" coords="448,0,526,132" href="../tk/index.htm"><area shape="rect" coords="528,1,615,119" href="../cookbook/index.htm"><area shape="rect" coords="617,0,690,135" href="../pxml/index.htm"></map> </BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -