【问题标题】:MongoWriteException not being caught by Java try catch block - MongoDB Server 4.2 - Java Driver 3.12.0 - Issue with MongoDB ExceptionsMongoWriteException 未被 Java try catch 块捕获 - MongoDB Server 4.2 - Java Driver 3.12.0 - MongoDB 异常问题
【发布时间】:2020-04-20 07:39:28
【问题描述】:

我有以下代码块,其中包含 MongoException 的异常处理程序。但是,虽然这里的 INSERT 引发了 MongoWriteException,但控件永远不会进入 try catch 块。尽管注释了代码,但仍会打印堆栈跟踪。还尝试使用 MongoException 和 DuplicateKeyException 无济于事。

protected boolean performDatabaseInsert(Document generic_document,String document_type) // document type is employee,department or leaveTransaction 
    {
        try
        {       
            generic_collection = mdb.getCollection(document_type);
            generic_collection.insertOne(generic_document);
            return true;

        }catch (MongoWriteException me) 
        {
            System.out.println("Exception occured on SignUp !");
            //me.printStackTrace();
            exception_handler.handleException(me);
            return false;
        }
     }

在 INSERT 操作之后,以下 StackTrace 被转储到控制台上。

com.mongodb.MongoWriteException: E11000 duplicate key error collection: LeaveApplicationSystemDB.employees index: username_1_is_admin_1 dup key: { username: "ali", is_admin: true }
    at com.mongodb.client.internal.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:1060)
    at com.mongodb.client.internal.MongoCollectionImpl.executeInsertOne(MongoCollectionImpl.java:503)
    at com.mongodb.client.internal.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:487)
    at com.mongodb.client.internal.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:481)
    at leaveapplicationsystem.MongoDatabaseConnectionImpl.performDatabaseInsert(MongoDatabaseConnectionImpl.java:59)
    at leaveapplicationsystem.lasServicesMongoImpl.performSignUpAction(lasServicesMongoImpl.java:72)
    at leaveapplicationsystem.SignUpServlet.doPost(SignUpServlet.java:69)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1639)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:830)


protected boolean handleException(MongoException s)
    {
        int error_code = s.getCode();
        String error_message = s.getMessage();
        System.out.println("App Action : " + InformationState.app_action);
        System.out.println("Error Code : " + error_code + "--" + error_message);

        switch (InformationState.app_action)
        {
            case "SignUp" :  //handle all possible SQL exceptions on SignUp. 
            {
                switch (error_code)
                {
                    case 11000 : //Integrity constraint violated, username already in use. 

                            System.out.println("Unique constraint violation...");
                            notify_appstate.setErrorMessage("Username/Employee# specified is already in use. Try again !. ");
                    break;

                    default:
                            notify_appstate.setErrorMessage("Unknown Error occurred. Contact System Admin. !");
                    break;
                }
            }
            break;

【问题讨论】:

  • 你试过ExceptionRuntimeException吗?
  • exception_handler.handleException(me) 的代码是什么?
  • 你好 Valijon ,没有尝试过异常或运行时异常。因为如果我使用那些我觉得我将无法提取我在异常处理程序上解释的 Mongo 异常错误代码。我不应该使用 Mongo Exception 类来提取 Mongo 错误代码吗?
  • 您好 Prasad,在 StackTrace 转储后添加了 exception_handler 代码 sn-p。

标签: mongodb exception mongodb-java


【解决方案1】:

刚刚遇到同样的问题。使用 DuplicateKeyException 解决了它。 就我而言,我在数据库中插入了一个名为“议程”的对象。 代码如下:

try {
    agendaRepository.insert(
        Agenda.builder()
          .name(agendaRequest.getName())
          .duration(agendaRequest.getDuration())
          .startTime(LocalDateTime.now())
          .build());
} catch (DuplicateKeyException e) {
        throw new AgendaAlreadyExistsException();
}

这是import org.springframework.dao.DuplicateKeyException;的一个例外

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多