异常后执行程序
Executing program after exception
您好,我想执行一个程序,将文本文档插入数据库。现在我刚刚完成错误部分。此刻它将信息输入数据库,但当它在数据字段中出现错误时,程序将停止执行。
我的objective是它会记录错误并继续执行程序。例如,如果文档中有 10 行,假设第三行有错误,那么无论如何我都希望插入 9 行。目前在这个例子中我的代码将只插入前两行。有什么方法或类似的东西可以帮助我完成这个吗?
**编辑格式
try {
while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
String[] parts = line.split("");
for (String part : parts) {
array1.add(part);
}
String query = " insert into FRONTMC.HECHO (folio_hecho, folio_orden, emisora, serie,"
+ "clave_sentido, titulos_hecho, precio, importe, liquidacion, contraparte, id_estatus, isin, contrato,"
+ "secondary_exec_id, exec_id, F11_ClOrdID, fecha_recepcion, fecha_sentra)"
+ " values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,convert(varchar(30),cast(? as datetime),120),convert(varchar(30),cast(? as datetime),120))";
PreparedStatement preparedStmt = con.prepareStatement(query);
for (int counter = 0; counter < array1.size(); counter++) {
if (array1.get(counter).substring(0, 3).equals("37=")) {
preparedStmt.setString(1, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 3).equals("37=")) {
preparedStmt.setString(2, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 3).equals("49=")) {
preparedStmt.setString(3, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 4).equals("447=")) {
preparedStmt.setString(4, array1.get(counter).substring(4));
}
if (array1.get(counter).substring(0, 3).equals("54=")) {
preparedStmt.setString(5, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 3).equals("32=")) {
preparedStmt.setString(6, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 3).equals("31=")) {
preparedStmt.setString(7, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 4).equals("381=")) {
preparedStmt.setString(8, array1.get(counter).substring(4));
}
if (array1.get(counter).substring(0, 3).equals("63=")) {
preparedStmt.setString(9, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 4).equals("448=")) {
preparedStmt.setString(10, array1.get(counter).substring(4));
}
if (array1.get(counter).substring(0, 4).equals("150=")) {
preparedStmt.setString(11, array1.get(counter).substring(4));
}
if (array1.get(counter).substring(0, 3).equals("48=")) {
preparedStmt.setString(12, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 2).equals("1=")) {
preparedStmt.setString(13, array1.get(counter).substring(2));
}
if (array1.get(counter).substring(0, 4).equals("527=")) {
preparedStmt.setString(14, array1.get(counter).substring(4));
}
if (array1.get(counter).substring(0, 3).equals("17=")) {
preparedStmt.setString(15, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 3).equals("11=")) {
preparedStmt.setString(16, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 3).equals("52=")) {
String date = array1.get(counter).substring(3);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MM/yyyy");
String ds2 = sdf2.format(sdf1.parse(date));
String x = date.substring(9, 21);
String newfecha1 = ds2 + " " + x;
preparedStmt.setString(17, newfecha1);
}
if (array1.get(counter).substring(0, 3).equals("52=")) {
String date = array1.get(counter).substring(3);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MM/yyyy");
String ds2 = sdf2.format(sdf1.parse(date));
String x = date.substring(9, 21);
String newfecha1 = ds2 + " " + x;
preparedStmt.setString(18, newfecha1);
}
}
preparedStmt.execute();
}
System.out.println(array1);
System.out.println("insert complete");
new Thread(new Runnable() {
@Override
public void run() {
exitomsj();
}
}).start();
reader.close();
} catch (Exception tryerror) {
System.out.println("Error en dato");
tryerror.printStackTrace();
}
除了清理的主要需求之外,您的问题是控制程序的流程,或者更具体地说,是缺乏程序的流程。您的所有代码都在 try
块中,包括循环。
有时这没关系,例如,如果同一个异常可能发生在多个地方,或者整个过程中可能会发生多个异常,并且您想以相同的方式处理它们,例如抛出您自己的自定义异常或只返回一个具体 "failed" 值。
然而,通常,一个巨大的 try
块是不行的,因为这样你的单个 catch
块就没有真正的方法来确定错误发生的位置,并且你没有充分控制程序的流程——它最后落入了这一块,之后无处可去;你想继续的例程已经落后了。
如果您使用多个 try/catch 块,一个用于每个需要处理的潜在异常,您可以定制每个 catch 块来处理该特定异常,特别是针对它发生的位置。然后,您无需担心尝试 "discover" 发生了什么或发生了什么,并且您没有失去在程序执行中的位置,这意味着您可以决定要用它做什么。
如果因为异常而想退出循环,可以使用break;
如果你想跳到下一次迭代,你可以使用 continue;
如果您想完全摆脱常规,可以使用 return;
如果您有多个嵌套循环,您可以通过标记来指定要中断或继续的循环。例如:
mainLoop:
for (int i = 0; i != someVariable; i++) {
//do something
nestedLoop:
for (int ii = 0; ii != someOtherVariable; ii++) {
//some code...
/*
** Here, you can then skip the remainder of the "nestedLoop" block,
** and start the next iteration of the "mainLoop" using `continue mainLoop;`
*/
//some more code...
}
}
我强烈建议您处理代码的表示,并根据给定的参数使用方法来执行某些操作。这将大大减少您实际需要编写的代码量。制作会更快、更愉快,产品也更容易维护。
您好,我想执行一个程序,将文本文档插入数据库。现在我刚刚完成错误部分。此刻它将信息输入数据库,但当它在数据字段中出现错误时,程序将停止执行。
我的objective是它会记录错误并继续执行程序。例如,如果文档中有 10 行,假设第三行有错误,那么无论如何我都希望插入 9 行。目前在这个例子中我的代码将只插入前两行。有什么方法或类似的东西可以帮助我完成这个吗?
**编辑格式
try {
while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
String[] parts = line.split("");
for (String part : parts) {
array1.add(part);
}
String query = " insert into FRONTMC.HECHO (folio_hecho, folio_orden, emisora, serie,"
+ "clave_sentido, titulos_hecho, precio, importe, liquidacion, contraparte, id_estatus, isin, contrato,"
+ "secondary_exec_id, exec_id, F11_ClOrdID, fecha_recepcion, fecha_sentra)"
+ " values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,convert(varchar(30),cast(? as datetime),120),convert(varchar(30),cast(? as datetime),120))";
PreparedStatement preparedStmt = con.prepareStatement(query);
for (int counter = 0; counter < array1.size(); counter++) {
if (array1.get(counter).substring(0, 3).equals("37=")) {
preparedStmt.setString(1, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 3).equals("37=")) {
preparedStmt.setString(2, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 3).equals("49=")) {
preparedStmt.setString(3, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 4).equals("447=")) {
preparedStmt.setString(4, array1.get(counter).substring(4));
}
if (array1.get(counter).substring(0, 3).equals("54=")) {
preparedStmt.setString(5, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 3).equals("32=")) {
preparedStmt.setString(6, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 3).equals("31=")) {
preparedStmt.setString(7, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 4).equals("381=")) {
preparedStmt.setString(8, array1.get(counter).substring(4));
}
if (array1.get(counter).substring(0, 3).equals("63=")) {
preparedStmt.setString(9, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 4).equals("448=")) {
preparedStmt.setString(10, array1.get(counter).substring(4));
}
if (array1.get(counter).substring(0, 4).equals("150=")) {
preparedStmt.setString(11, array1.get(counter).substring(4));
}
if (array1.get(counter).substring(0, 3).equals("48=")) {
preparedStmt.setString(12, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 2).equals("1=")) {
preparedStmt.setString(13, array1.get(counter).substring(2));
}
if (array1.get(counter).substring(0, 4).equals("527=")) {
preparedStmt.setString(14, array1.get(counter).substring(4));
}
if (array1.get(counter).substring(0, 3).equals("17=")) {
preparedStmt.setString(15, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 3).equals("11=")) {
preparedStmt.setString(16, array1.get(counter).substring(3));
}
if (array1.get(counter).substring(0, 3).equals("52=")) {
String date = array1.get(counter).substring(3);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MM/yyyy");
String ds2 = sdf2.format(sdf1.parse(date));
String x = date.substring(9, 21);
String newfecha1 = ds2 + " " + x;
preparedStmt.setString(17, newfecha1);
}
if (array1.get(counter).substring(0, 3).equals("52=")) {
String date = array1.get(counter).substring(3);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MM/yyyy");
String ds2 = sdf2.format(sdf1.parse(date));
String x = date.substring(9, 21);
String newfecha1 = ds2 + " " + x;
preparedStmt.setString(18, newfecha1);
}
}
preparedStmt.execute();
}
System.out.println(array1);
System.out.println("insert complete");
new Thread(new Runnable() {
@Override
public void run() {
exitomsj();
}
}).start();
reader.close();
} catch (Exception tryerror) {
System.out.println("Error en dato");
tryerror.printStackTrace();
}
除了清理的主要需求之外,您的问题是控制程序的流程,或者更具体地说,是缺乏程序的流程。您的所有代码都在 try
块中,包括循环。
有时这没关系,例如,如果同一个异常可能发生在多个地方,或者整个过程中可能会发生多个异常,并且您想以相同的方式处理它们,例如抛出您自己的自定义异常或只返回一个具体 "failed" 值。
然而,通常,一个巨大的 try
块是不行的,因为这样你的单个 catch
块就没有真正的方法来确定错误发生的位置,并且你没有充分控制程序的流程——它最后落入了这一块,之后无处可去;你想继续的例程已经落后了。
如果您使用多个 try/catch 块,一个用于每个需要处理的潜在异常,您可以定制每个 catch 块来处理该特定异常,特别是针对它发生的位置。然后,您无需担心尝试 "discover" 发生了什么或发生了什么,并且您没有失去在程序执行中的位置,这意味着您可以决定要用它做什么。
如果因为异常而想退出循环,可以使用break;
如果你想跳到下一次迭代,你可以使用 continue;
如果您想完全摆脱常规,可以使用 return;
如果您有多个嵌套循环,您可以通过标记来指定要中断或继续的循环。例如:
mainLoop:
for (int i = 0; i != someVariable; i++) {
//do something
nestedLoop:
for (int ii = 0; ii != someOtherVariable; ii++) {
//some code...
/*
** Here, you can then skip the remainder of the "nestedLoop" block,
** and start the next iteration of the "mainLoop" using `continue mainLoop;`
*/
//some more code...
}
}
我强烈建议您处理代码的表示,并根据给定的参数使用方法来执行某些操作。这将大大减少您实际需要编写的代码量。制作会更快、更愉快,产品也更容易维护。