在perl中捕获内联java错误
在这个使用内联saxon XSLT解析器的小perl脚本中:在perl中捕获内联java错误,java,perl,xslt,error-handling,Java,Perl,Xslt,Error Handling,在这个使用内联saxon XSLT解析器的小perl脚本中: use Inline::Java; use warnings; use XML::Saxon::XSLT2; open(my $xslt, '<:encoding(UTF-8)', $xslfile) or die $!; open(my $xml, '<:encoding(UTF-8)', $xmlfile) or die $!; my $trans = XML::Saxon::XSLT2->new($xslt)
use Inline::Java;
use warnings;
use XML::Saxon::XSLT2;
open(my $xslt, '<:encoding(UTF-8)', $xslfile) or die $!;
open(my $xml, '<:encoding(UTF-8)', $xmlfile) or die $!;
my $trans = XML::Saxon::XSLT2->new($xslt);
my $output = $trans->transform($xml);
print $output;
然后perl错误被记录在/tmp/日志文件中,而不是saxon错误。您应该能够使用它来完成这项工作,它可以从外部程序和XS中获取STDOUT和STDERR
use strict;
use warnings;
use XML::Saxon::XSLT2;
use Capture::Tiny 'capture';
my ($xslfile, $xmlfile) = ( ... );
open(my $xslt, '<:encoding(UTF-8)', $xslfile) or die $!;
open(my $xml, '<:encoding(UTF-8)', $xmlfile) or die $!;
my $trans = XML::Saxon::XSLT2->new($xslt);
my $output;
my ( $stdout, $stderr ) = capture {
$output = $trans->transform($xml);
};
print $output;
使用严格;
使用警告;
使用XML::Saxon::XSLT2;
使用捕获::微小的“捕获”;
我的($xslfile,$xmlfile)=(…);
open(my$xslt,JVM有自己的标准错误概念,不容易从Perl中操作。要执行您想要执行的操作,我认为必须在JVM启动之前重置STDERR
。这将需要BEGIN
块,该块出现在use Inline Java
语句之前
概念证明:
# javaerr.pl
BEGIN {
open OLDERR, '>&STDERR'; # save orig STDERR
open STDERR, '>', 'foo'; # redirect before JVM starts
}
use Inline Java => <<'END_OF_JAVA_CODE';
public class Foo {
static {
System.err.println("loaded Foo static block");
}
public Foo() {
}
public void warn(String msg) {
System.err.println("Foo warning: " + msg);
}
}
END_OF_JAVA_CODE
*STDERR = *OLDERR; # restore orig STDERR
open STDERR, '>', 'bar'; # or direct it somewhere else
$Foo = Foo->new();
$Foo->warn("hello world");
print STDERR "goodbye\n";
在启动JVM之前重置STDERR,谢谢!
# javaerr.pl
BEGIN {
open OLDERR, '>&STDERR'; # save orig STDERR
open STDERR, '>', 'foo'; # redirect before JVM starts
}
use Inline Java => <<'END_OF_JAVA_CODE';
public class Foo {
static {
System.err.println("loaded Foo static block");
}
public Foo() {
}
public void warn(String msg) {
System.err.println("Foo warning: " + msg);
}
}
END_OF_JAVA_CODE
*STDERR = *OLDERR; # restore orig STDERR
open STDERR, '>', 'bar'; # or direct it somewhere else
$Foo = Foo->new();
$Foo->warn("hello world");
print STDERR "goodbye\n";
$ perl javaerr.pl
$ cat foo
loaded Foo static block
Foo warning: hello world
$ cat bar
goodbye