Java 推迟例外
我有一种定期的方法,例如每10秒尝试一次连接到服务器并从中读取一些数据。服务器可能并非始终可用。如果服务器不可用,该方法将引发异常Java 推迟例外,java,exception,Java,Exception,我有一种定期的方法,例如每10秒尝试一次连接到服务器并从中读取一些数据。服务器可能并非始终可用。如果服务器不可用,该方法将引发异常 除了服务器至少一分钟不可用外,实现不引发异常的包装器方法的最佳方法是什么?跟踪上次成功到达服务器的时间。如果服务器抛出异常,请捕获它并与上次到达服务器的时间进行比较。如果该时间超过一分钟,请重新显示异常。跟踪上次成功到达服务器的时间。如果服务器抛出异常,请捕获它并与上次到达服务器的时间进行比较。如果时间超过一分钟,请重新显示异常。您必须记录最初尝试连接到服务器的时间
除了服务器至少一分钟不可用外,实现不引发异常的包装器方法的最佳方法是什么?跟踪上次成功到达服务器的时间。如果服务器抛出异常,请捕获它并与上次到达服务器的时间进行比较。如果该时间超过一分钟,请重新显示异常。跟踪上次成功到达服务器的时间。如果服务器抛出异常,请捕获它并与上次到达服务器的时间进行比较。如果时间超过一分钟,请重新显示异常。您必须记录最初尝试连接到服务器的时间,然后捕获异常。如果捕获异常的时间超过原始时间+1分钟,请重新播放异常。如果没有,请重试。您必须记录最初尝试连接到服务器的时间,然后捕获异常。如果捕获异常的时间超过原始时间+1分钟,请重新播放异常。如果没有,请重试。理想情况下,您可以在对服务器的呼叫上设置一个超时。如果失败,请在catch块中执行thread.sleep600,然后重试,如果第二个线程没有返回,则会失败。理想情况下,您可以在对服务器的调用上设置一个超时。如果失败,请在catch块中执行thread.sleep600并重试,如果第二个线程没有返回,则会失败。在伪代码中
//Create Timer
//Start Timer
bool connected = false;
while (!connected)
try {
//Connect To DB
connected = true;
}
catch (Exception ex) {
if (more than 1 minute has passed)
throw new Exception(ex);
}
}
在伪代码中
//Create Timer
//Start Timer
bool connected = false;
while (!connected)
try {
//Connect To DB
connected = true;
}
catch (Exception ex) {
if (more than 1 minute has passed)
throw new Exception(ex);
}
}
您可以有一个重试计数,如果您的案例中达到了所需的计数6,则抛出一个异常
int count = 0;
CheckServer(count);
public void CheckServer(count) {
try
{
// connect to server
}
catch(Exception e)
{
if(count < MAX_ATTEMPTS) {
// wait 10 seconds
CheckServer(count++)
}
else {
throw e;
}
}
}
您可以有一个重试计数,如果您的案例中达到了所需的计数6,则抛出一个异常
int count = 0;
CheckServer(count);
public void CheckServer(count) {
try
{
// connect to server
}
catch(Exception e)
{
if(count < MAX_ATTEMPTS) {
// wait 10 seconds
CheckServer(count++)
}
else {
throw e;
}
}
}
您可以为服务器连接是否成功设置一个布尔变量,并在异常处理程序中检查它,如下所示:
class ServerTester : public Object
{
private bool failing;
private ServerConnection serverConnection;
private Time firstFailure;
public ServerTester(): failing(false)
{
}
public void TestServer() throws ServerException
{
try
{
serverConnection.Connect();
failing = false;
}
catch (ServerException e)
{
if (failing)
{
if (Time::GetTime() - firstFailure > 60)
{
failing = false;
throw e;
}
}
else
{
firstFailure = Time::GetTime();
failing = true;
}
}
}
}
我不知道API的实际时间是多少,因为我上次使用Java已经有一段时间了。这会满足你的要求,但似乎有点不对劲。对异常的轮询给我的印象有点倒退,但由于您处理的是服务器,我想不出任何其他方法。您可以为服务器连接是否成功设置一个布尔变量,并在异常处理程序中检查它,如下所示:
class ServerTester : public Object
{
private bool failing;
private ServerConnection serverConnection;
private Time firstFailure;
public ServerTester(): failing(false)
{
}
public void TestServer() throws ServerException
{
try
{
serverConnection.Connect();
failing = false;
}
catch (ServerException e)
{
if (failing)
{
if (Time::GetTime() - firstFailure > 60)
{
failing = false;
throw e;
}
}
else
{
firstFailure = Time::GetTime();
failing = true;
}
}
}
}
我不知道API的实际时间是多少,因为我上次使用Java已经有一段时间了。这会满足你的要求,但似乎有点不对劲。对异常的轮询给我的印象是有点倒退,但由于您处理的是服务器,我想不出任何其他方法。请记住,异常处理只是普通返回系统的一种非常专门的用途。有关更多技术细节,请阅读monads。如果您想要发出信号的异常情况不适合Java的异常处理系统,那么使用异常可能是不合适的
您可以用通常的方法跟踪错误情况:保留一个状态变量,根据需要使用成功/失败信息对其进行更新,并在状态更改时做出适当的响应。请记住,异常处理只是通常返回系统的一种非常专门的用途。有关更多技术细节,请阅读monads。如果您想要发出信号的异常情况不适合Java的异常处理系统,那么使用异常可能是不合适的
您可以用通常的方法跟踪错误情况:保留一个状态变量,根据需要使用成功/失败信息对其进行更新,并在状态更改时做出适当响应。服务器实际上不会引发异常,引发异常的是客户机代码;然而,我仍然对你的答案投了+1票;然而,我仍然对你的答案投了+1票。