我有一个每10分钟运行一次的桌面应用程序。我在开始时要求登录凭据然后继续,直到用户退出应用程序。
我的逻辑是这样的,如果他输入正确的凭证,那么就会创建表并存储他的登录信息。如果他输入了错误的凭据,则会删除存储错误凭据的表,并弹出弹出无效登录信息。
但是当用户的系统进入待机状态或休眠状态或没有互联网连接时,基本上如果应用程序无法连接到邮件,那么它会进入表删除部分并删除表。
我该如何处理?如果有互联网中断,我希望如果用户之前已成功登录,则不应该退出该表而是退出。
这是代码 - 创建登录表并插入记录(无关紧要是否真实)后,控件就会出现 -
public void run(){
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imap");
try{
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imap");
store.connect(getMailboxId(), getEmailId(), getPassword());
inbox = store.getFolder("Inbox");
<<some data processing>>
}
catch (NoSuchProviderException e){
e.printStackTrace();
System.exit(1);
}
catch (MessagingException e){
try {
new DbConnect().deleteRecords(); //Delete table if invalid credentials
} catch (ClassNotFoundException d) {
d.printStackTrace();
}
e.printStackTrace();
JOptionPane.showMessageDialog(controllingFrame,
"Invalid Credentials. Try again.",
"Error Message",
JOptionPane.ERROR_MESSAGE);
System.exit(2);
}
答案 0 :(得分:0)
你可以ping你的服务器(java code to ping an IP address)然后按行动吗?
伪码:
pingResult = ping server;
if (pingResult == connectedToServer) {
result = table save or delete; //Working method
}else {
result = only test against last login table;
}
continue with rest of program;
修改强> 请注意,您在MessagingException之前/之后抛出NoSuchProviderException。我确定你知道NoSuchProviderException扩展了MessagingException(http://docs.oracle.com/javaee/1.4/api/javax/mail/NoSuchProviderException.html),因此,错误可能总是发送到MessagingException catch。
棘手的部分是Store将MessagingException作为catch all抛出。我会在try中设置一个标志值,并且只捕获NoSuchProviderException,然后在try catch测试之外,将标志与默认值进行对比,并按行动进行操作。我认为你可以捕获的更具体的错误更准确。
因此,您提供的代码如下所示:
public void run(){
**boolean flag = false;**
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imap");
try{
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imap");
store.connect(getMailboxId(), getEmailId(), getPassword());
inbox = store.getFolder("Inbox");
**flag = true;**
<<some data processing>>
}
catch (NoSuchProviderException e){
e.printStackTrace();
System.exit(1);
}
**if (!flag) {**
try {
new DbConnect().deleteRecords(); //Delete table if invalid credentials
} catch (ClassNotFoundException d) {
d.printStackTrace();
}
e.printStackTrace();
JOptionPane.showMessageDialog(controllingFrame,
"Invalid Credentials. Try again.",
"Error Message",
JOptionPane.ERROR_MESSAGE);
System.exit(2);
}