我有很多关于人们如何在Perl中使用异常的问题.我已经包含了一些关于异常的背景说明,如果你愿意,请跳过这个,但请花点时间阅读问题并回答它们.
谢谢.
Perl有一个非常基本的内置异常系统,可提供弹簧板以实现更复杂的使用.
例如,die "I ate a bug.\n";抛出一个分配了字符串的异常$@.
您也可以抛出一个对象,而不是字符串: die BadBug->new('I ate a bug.');
您甚至可以安装信号处理程序来捕获SIGDIE伪信号.这是一个处理程序,它将异常重新抛出为对象(如果它们尚未存在).
$SIG{__DIE__} = sub {
my $e = shift;
$e = ExceptionObject->new( $e ) unless blessed $e;
die $e;
}
Run Code Online (Sandbox Code Playgroud)
此模式用于许多CPAN模块.但是perlvar说:
由于实现故障,$ SIG { DIE }挂钩甚至在eval()内部被调用.不要使用它来重写$ @中的挂起异常,或者作为重写CORE :: GLOBAL :: die()的奇怪替代.远程的这种奇怪动作可以在将来的版本中修复,这样只有当你的程序即将退出时才会调用$ SIG { DIE },就像原始意图一样.任何其他用途都已弃用.
所以现在我想知道在sigdie中对异常进行客观化是邪恶的.
你使用异常对象吗?如果是这样,哪一个和为什么?如果没有,为什么不呢?
如果您不使用异常对象,会有什么诱使您使用它们?
如果您确实使用了异常对象,那么您对它们有何厌恶,哪些更好?
在DIE处理程序中对异常进行客观化是一个坏主意吗?
我应该在哪里客观化我的例外情况?在我的eval {}包装器中?在一个sigdie处理程序?
是否有任何关于例外情况的文章,文章或其他资源,以及您发现有用或有启发性的Perl.
在Perlmonks交叉发布.
每当我处理任何具有处理包管理的特定方式的系统时,我都会尝试坚持使用该标准来管理我的Perl模块."在罗马等时"
例如,在使用ActivePerl的Win32系统上,我将PPM用于所有内容并使用优秀的PPM :: Make.在RedHat系统上,我更喜欢使用RPM.
现在我正在研究Debian系统,并发现自己需要一种方法将任意CPAN或CPAN样式分配转换为deb.
Google展示了dh-make-perl,CPANPLUS :: Dist :: Deb和CPAN :: Packager :: Builder :: Deb等选项.
有这些不同工具经验的人是否有任何关于使用或避免使用的建议?
处理标准CPAN模块构建deb文件的最佳方法是什么?
我找到了Hans Dieter Piercy关于这个主题的文章 - 他根据自己的需要建议了CPANPLUS工具.在某些情况下,他建议使用dh-make-perl.Jeremiah Foster(撰写文章brian d foy指向)回应HDP并为dh-make-perl提供案例.
在idimmu.net上还有一篇文章描述了使用dh-make-perl.
ATM,我倾向于dh-make-perl,因为已经三次推荐(brian d foy作为Jeremy Foster的代理人,idimmu.net作者和hillu)vs CPANPLUS
考虑这个简单的类:
package Foo;
use Moose;
has foo => ( is => 'rw', isa => 'Int' );
Run Code Online (Sandbox Code Playgroud)
然后这段代码:
use Try::Tiny;
use Foo;
my $f = try {
Foo->new( foo => 'Not an Int' );
}
catch {
warn $_;
};
Run Code Online (Sandbox Code Playgroud)
代码消失了一个关于类型约束失败的很好的大错误消息.
我希望能够提取失败的属性(foo),原因是什么(失败的类型约束)以及传递的值是什么(Not an Int)而不必解析错误字符串来获取信息.
像这样的东西:
catch {
if( $_->isa( 'MooseX::Exception::TypeConstraint' ) ) {
my $attrib = $_->attribute;
my $type = $_->type;
my $value = $_->bad_value;
warn "'$value' is an illegal value for '$attrib'. It should be a …Run Code Online (Sandbox Code Playgroud) 我们都应该熟悉Perl中与原型相关的问题.以下是两个大佬:
第二项是我现在很好奇的一项.
我知道有两种方法可以在调用子程序时颠覆/解决/忽略原型强制执行:
Foo->subroutine_name();&印记调用潜艇.&subroutine_name();还有其他有趣的案例我错过了吗?
UDPATE:
@brian d foy,我并不特别想逃避原型,但我想知道"有多少种方法可以做到这一点?" 出于好奇,我问这个问题.
@jrockway,我同意你的观点,我相信你有更明确,更简洁地描述了关于原型问题的第一点,人们会误解它们.也许问题在于程序员的期望,而不在于功能.但这确实是一个我不想要的哲学问题.
在构建器方法中处理故障的最佳方法是什么?
例如:
package MyObj;
use Moose;
use IO::File;
has => 'file_name' ( is => 'ro', isa => 'Str', required =>1 );
has => 'file_handle' ( is => 'ro', isa => 'IO::File', lazy_build => 1 );
sub _build_file_handle {
my $self = shift;
my $fh = IO::File->new( $self->file_name, '<' );
return $fh;
}
Run Code Online (Sandbox Code Playgroud)
如果_build_file_handle无法获得句柄,则构建器将返回undef,这会使类型约束失败.
我可以在file_handle类型约束中使用union ,以便它接受undef一个有效值.但是has_file_handle,即使值很大,谓词也会返回true undef.
有没有办法表明构建器失败了,属性应该保持清除?
I often find myself experimenting in the REPL and I will say something like:
subset Bar of Int where * %% 57;
Then I play around with checks on the Bar-ness for things for a bit.
Everything is happy, until I realize that I want to change the definition of Bar.
If I just redefine Bar, I get a Redeclaration of symbol exception.
I tried using MONKEY-TYPING and augment like this:
use MONKEY-TYPING;
augment subset Bar of …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,我使用PerlApp分发成"二进制"形式进行分发.由于我的客户想要为他们的Win32系统进行简单的安装,这非常好用.
现在,客户已决定他们需要运行所有单元测试,例如在标准安装中.但是,他们仍然不会安装普通的Perl.
因此,我发现自己需要一种方法来打包我的单元测试以便在我的客户端系统上进行操作.
我的第一个想法是,我可以打包prove在一个文件中并分别打包我的每个测试.然后发送具有适当结构的zip文件.
一些研究表明,Test :: Harness :: Straps从命令行调用perl.
是否有现有工具可以帮助完成此过程?
也许我可以使用PAR::Packer的parl工具来处理我的测试脚本调用.
我对如何应用PAR或PerlApp以及如何处理覆盖Test :: Harness和朋友的任何想法感兴趣.
谢谢.
更新:我没有在PAR或PerlApp上设置我的心脏.这些只是我熟悉的工具.如果您有想法或解决方案需要不同的打包器(例如Cava Packager),我很乐意听到它.
更新2: tsee指出PAR中的一个很棒的新功能让我接近.是否有任何TAP专家可以提供一些想法或指示在新的Test :: Harness发行版中查看的位置?
我们在工作中有一个.NET项目,我们丢失了(人为错误).编写代码的人说她在解决方案中有三个项目=>一个webform,一个winform和一个类库.
现在,我们有最终的DLL和网站.我们能做些什么呢?
对于类库,我正在考虑使用Reflector来复制/粘贴代码,并且随着时间的推移,将MethodNames和变量等重命名为一些不错的英文内容.
对于网站,不确定.
有没有人有任何想法或选择?
她说她没有pdb文件:((发布版本).
干杯:)
我在学校的Web脚本课上,正在完成我的第一个任务.我倾向于过度开展事情并深入研究我的课程,而不是课程所要求的.现在我正在研究CGI.pm来做我的HTTP请求,它说CGI.pm有两种编程风格:
除非我忽略了明确的答案,或者我没有足够的知识从我在http://perldoc.perl.org/CGI.html提供的文档中辨别出自己的答案.我只是不知道使用的利弊是什么这两种风格不同.
有了这个说,使用这两种不同风格的利弊是什么?哪一个更常用?至于使用面向对象的样式,它说我当时只能使用一个CGI对象.这是为什么?
感谢你的帮助.你们都为我学习计算机科学非常愉快,满意和有益.= d
在Perl中,有没有理由将单个变量封装在双引号中(没有连接)?
我经常在我正在研究的程序的源代码中找到这个(10年前由不在这里工作的人写的):
my $sql_host = "something";
my $sql_user = "somethingelse";
# a few lines down
my $db = sub_for_sql_conection("$sql_host", "$sql_user", "$sql_pass", "$sql_db");
Run Code Online (Sandbox Code Playgroud)
据我所知,没有理由这样做.当我使用旧脚本时,我通常会删除引号,因此我的编辑器将它们变为变量而不是字符串.
我认为他们在某个地方看到了这个并复制了风格而没有理解为什么会这样.我错过了什么吗?
谢谢.