Java JRI-如何在R中定位错误

Java JRI-如何在R中定位错误,java,mysql,r,jri,rjdbc,Java,Mysql,R,Jri,Rjdbc,因此,基本上,我使用的是Java、JRI(R for Java)和RJDBC(在JRI的帮助下),它们都运行得非常好。 现在,我想让我的程序尽可能的简单。比如说,stringsqlu命令是一种垃圾,不是一个真正有效的SQL语句。那样的话 re.eval("sql_data <- dbGetQuery(conn, \"" + SQL_command + "\")"); re.eval(“sql_data根据,null将在出现问题时返回。该方法不会引发任何类型的异常,因此它似乎没有提

因此,基本上,我使用的是Java、JRI(R for Java)和RJDBC(在JRI的帮助下),它们都运行得非常好。 现在,我想让我的程序尽可能的简单。比如说,stringsqlu命令是一种垃圾,不是一个真正有效的SQL语句。那样的话

    re.eval("sql_data <- dbGetQuery(conn, \"" + SQL_command + "\")");
re.eval(“sql_data根据,
null
将在出现问题时返回。该方法不会引发任何类型的
异常
,因此它似乎没有提供任何确定问题原因的方法

确实会抛出两种类型的
Exception
REngineException
REXPMismatchException
,这可能会对失败提供更多解释,但文档不清楚抛出这些异常的确切原因和时间

因此,在这种情况下,您最好检查
null
返回值。

我建议直接在R中捕获由R代码引起的(可能的)异常。因此,如果我怀疑某个命令可能会出错,我会在R中使用
try
函数。大致如下:

       REXP y = re.eval("sql_data <- try(dbGetQuery(conn, \"" + SQL_command + "\"),silent=TRUE)");
       REXP x = re.eval("class(sql_data)");
       if ((x.asString()).equals("try-error")) {
          System.out.println(y.asString());
          // do something to catch the exception
       } else {
         // do normal stuff
       }

我尝试过这个,但没有成功。通过使用re.eval()命令生成一个对象,只要括号中的R命令失败,它就会停止执行它所做的任何操作。换句话说:REXP x=re.eval(一些错误的R_代码);跳过所有操作。你能准确地提供给R的SQL_命令吗?SQL_数据我忘记了asString()
getAttribute
之后。我要编辑我的答案。让我看看它是否有效。它不起作用,因为在我将re.eval存储到REXP对象后,它会跳过所有内容。但是,如果re.eval命令正确执行,则不会发生这种情况。奇怪的是……我没有parseAndEval()-Method.re.parseAndEval(字符串)根据Eclipse不存在。请注意,
parseAndEval
方法位于另一个包中的一个完全不同的类中(名称几乎完全相同)。因此您的
re
对象将无法调用该方法。我不明白……什么类型的捕获?re.capture.output()不存在。如果你是说R的内部…没有真正的帮助。我如何使用“最后一次警告”?“猫(最后一次警告)”?好吧,这就是为什么它是一个评论而不是答案。只是一个建议。
      import java.io.*;
      import org.rosuda.JRI.*;
      public class Prova {
         public static void main(String[] args) {
           String[] commands = {"a<-try(dbGetQuery(conn,'show tables'))","a<-try(dbGetQuery(conn,'SS'))"};
           Rengine re=new Rengine (new String [] {"--vanilla"}, false, null);
           re.eval("require(RMySQL)");
           re.eval("conn<-dbConnect(MySQL(),user='xxx',password='xxx',dbname='xxx')");
           for (int i=0;i<2;i++) {
             REXP y = re.eval(commands[i]);
             REXP x = re.eval("class(a)");
             if ((x.asString()).equals("try-error")) {
               System.out.println(y.asString());
             } else {
               System.out.println(x.asString());
             }
           }
           re.end();
         }
      }
   data.frame
   Error in mysqlExecStatement(conn, statement, ...) : 
     RS-DBI driver: (could not run statement: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SS' at line 1)