Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl中捕获内联java错误_Java_Perl_Xslt_Error Handling - Fatal编程技术网

在perl中捕获内联java错误

在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)

在这个使用内联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);
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