异常后执行程序

时间:2018-06-20 18:56:55

标签: java exception execution

你好,我想执行一个程序,将文本文件从数据库插入数据库。现在,我只是结束了错误部分。目前,它将信息输入数据库,但是当它在数据字段中出现错误时,程序将停止执行。

我的目标是它将记录错误并继续执行程序。例如,如果文档中有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();
    }

1 个答案:

答案 0 :(得分:0)

除了需要进行一些清洗外,您的问题是控制程序的流程,或更具体地说,是缺少程序。您将所有代码都放在try块中,包括循环。

有时候这是可以的,例如,如果相同的异常可以在多个地方发生,或者多个异常可以在整个地方发生,并且您希望以相同的方式处理它们,例如抛出自己的自定义异常或只返回特定的“失败”值。

但是,通常情况下,一个大的try块是不可行的,因为那样的话,您的单个catch块就没有确定错误发生位置的真正方法,并且您无法充分控制错误的发生程序-它最终落入这一块,之后无处可去;您要继续执行的常规程序已经落后了。

如果您使用多个try / catch块(每个需要处理的潜在异常一个),则可以定制每个catch块以处理该特定异常,特别是针对发生异常的位置。这样,您就不必担心试图“发现”发生的事情或发生的地方,并且在程序的执行中也没有失去自己的位置,这意味着您可以决定要使用它做什么。

如果由于异常而要退出循环,可以使用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...
    }
}

我强烈建议您进行代码表示,并利用方法根据给定的参数执行某些操作。这将大大缩短您实际必须编写的代码量。生产将更快,更愉快,并且产品将更易于维护。