基本上,我使用的是Java、JRI ( RJDBC )和RJDBC(在JRI的帮助下),它们都运行得很好。现在,我想使我的程序尽可能的万无一失。比方说,字符串SQL_command是某种垃圾,并不是一个有效的SQL-语句。那样的话..。
re.eval("sql_data <- dbGetQuery(conn, \"" + SQL_command + "\")");...should出错了。我的想法是这样的:如果R命令失败,R中就会有某种输出,如果一切都正确,就没有输出。但是我如何捕捉到可能的输出呢?
请记住,我的问题更多是关于如何捕获无效的R语句,因此对于可能的解决方案的任何其他建议也会受到赞赏。R输出不一定重要,但无论如何它可能是有趣的。
提前感谢!
发布于 2014-10-12 18:48:24
我建议在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
}这样,您还可以显示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)发布于 2014-10-12 18:09:19
根据 method的说法,如果出了什么问题,null将被退回。该方法不会抛出任何类型的Exception,因此它似乎没有提供任何方法来确定问题的原因。
method确实抛出了几个Exception类型,即REngineException和REXPMismatchException,它们可能会提供更多的故障解释,但文档并不清楚这些类型将被抛出的确切原因和时间。
因此,您可以做的最好的事情就是检查一个null返回值。
https://stackoverflow.com/questions/26327475
复制相似问题