避免由于线程产生的异常而终止应用程序
Avoid the termination of an applicaiton due to an exception generated by a thread
我正在使用 Java 套接字开发客户端-服务器应用程序。
客户端必须等待服务器的响应。当服务器收到客户端的请求时,它会执行某些任务以获得必须传递给客户端的结果 - 但执行这些任务可能会导致错误。
有什么方法可以在发生此错误时应用程序不终止并继续处理请求?
package Socket;
import javax.swing.*;
import java.awt.*;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Server
{
public static void main(String[] args)
{
MainWindow application=new MainWindow();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MainWindow extends JFrame implements Runnable
{
public MainWindow()
{
setBounds(1200,300,280,350);
JPanel myPanel= new JPanel();
myPanel.setLayout(new BorderLayout());
text=new JTextArea();
myPanel.add(text,BorderLayout.CENTER);
add(myPanel);
setVisible(true);
Thread t= new Thread(this);
t.start();
}
private JTextArea text;
@Override
public void run()
{
try
{
ServerSocket Server = new ServerSocket(9999);
while(true)
{
Socket mySocket = Server.accept();
DataInputStream input_stream = new DataInputStream(mySocket.getInputStream());
String message = input_stream.readUTF();
someMethod(); //This method can generate an exception, then the application closes and I can not receive new requests
text.append("\n" + message);
mySocket.close();
}
}
catch (IOException ex)
{
Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
在循环中捕获异常。
ServerSocket Server = new ServerSocket(9999);
while(true) {
try {
Socket mySocket = Server.accept();
DataInputStream input_stream = new DataInputStream(mySocket.getInputStream());
String message = input_stream.readUTF();
someMethod(); //This method can generate an exception, then the application closes and I can not receive new requests
text.append("\n" + message);
mySocket.close();
} catch (IOException ex) {
Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);
}
}
然后您将记录异常并继续。
PS: 可能有一些异常意味着重试是徒劳的,你需要放弃这个过程而不是用无数的严重错误填满日志。
我建议阅读文档并设计比 'ignore everything and soldier on' 稍微成熟的错误处理策略。
A try-catch 不必一次遍历所有代码。围绕整个 run
方法的方法对于记录真正致命的错误非常有用。您可以在 someMethod();
周围设置另一个,以防止这些异常打破循环:
try {
someMethod();
} catch(ZeroDivisionException e) {
// handle the exception
} catch(SomeOtherException e) {
// handle the other exception
}
这里的例外情况是编造的,但我相信你明白了。你如何处理它们取决于你。只要你不 re-throw 它们中的任何一个,循环就不会结束,你的外部块也不会被触发。
您可以随心所欲地嵌套 catch 块,因此您可以在内部块和外部块中捕获 IOException
。外部块仍会清除您无法控制的错误。
我正在使用 Java 套接字开发客户端-服务器应用程序。
客户端必须等待服务器的响应。当服务器收到客户端的请求时,它会执行某些任务以获得必须传递给客户端的结果 - 但执行这些任务可能会导致错误。
有什么方法可以在发生此错误时应用程序不终止并继续处理请求?
package Socket;
import javax.swing.*;
import java.awt.*;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Server
{
public static void main(String[] args)
{
MainWindow application=new MainWindow();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MainWindow extends JFrame implements Runnable
{
public MainWindow()
{
setBounds(1200,300,280,350);
JPanel myPanel= new JPanel();
myPanel.setLayout(new BorderLayout());
text=new JTextArea();
myPanel.add(text,BorderLayout.CENTER);
add(myPanel);
setVisible(true);
Thread t= new Thread(this);
t.start();
}
private JTextArea text;
@Override
public void run()
{
try
{
ServerSocket Server = new ServerSocket(9999);
while(true)
{
Socket mySocket = Server.accept();
DataInputStream input_stream = new DataInputStream(mySocket.getInputStream());
String message = input_stream.readUTF();
someMethod(); //This method can generate an exception, then the application closes and I can not receive new requests
text.append("\n" + message);
mySocket.close();
}
}
catch (IOException ex)
{
Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
在循环中捕获异常。
ServerSocket Server = new ServerSocket(9999);
while(true) {
try {
Socket mySocket = Server.accept();
DataInputStream input_stream = new DataInputStream(mySocket.getInputStream());
String message = input_stream.readUTF();
someMethod(); //This method can generate an exception, then the application closes and I can not receive new requests
text.append("\n" + message);
mySocket.close();
} catch (IOException ex) {
Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);
}
}
然后您将记录异常并继续。
PS: 可能有一些异常意味着重试是徒劳的,你需要放弃这个过程而不是用无数的严重错误填满日志。
我建议阅读文档并设计比 'ignore everything and soldier on' 稍微成熟的错误处理策略。
A try-catch 不必一次遍历所有代码。围绕整个 run
方法的方法对于记录真正致命的错误非常有用。您可以在 someMethod();
周围设置另一个,以防止这些异常打破循环:
try {
someMethod();
} catch(ZeroDivisionException e) {
// handle the exception
} catch(SomeOtherException e) {
// handle the other exception
}
这里的例外情况是编造的,但我相信你明白了。你如何处理它们取决于你。只要你不 re-throw 它们中的任何一个,循环就不会结束,你的外部块也不会被触发。
您可以随心所欲地嵌套 catch 块,因此您可以在内部块和外部块中捕获 IOException
。外部块仍会清除您无法控制的错误。