mirror of
https://github.com/ppy/osu.git
synced 2024-12-16 06:52:55 +08:00
Merge pull request #6677 from peppy/catch-api-request-exceptions
Cover all non-APIAccess APIRequest calls with exception handling
This commit is contained in:
commit
b0737535d1
@ -392,9 +392,16 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
req.Failure += e => { LogForModel(set, $"Online retrieval failed for {beatmap} ({e.Message})"); };
|
req.Failure += e => { LogForModel(set, $"Online retrieval failed for {beatmap} ({e.Message})"); };
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
// intentionally blocking to limit web request concurrency
|
// intentionally blocking to limit web request concurrency
|
||||||
req.Perform(api);
|
req.Perform(api);
|
||||||
}
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
LogForModel(set, $"Online retrieval failed for {beatmap} ({e.Message})");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,16 +86,7 @@ namespace osu.Game.Database
|
|||||||
}, TaskCreationOptions.LongRunning);
|
}, TaskCreationOptions.LongRunning);
|
||||||
};
|
};
|
||||||
|
|
||||||
request.Failure += error =>
|
request.Failure += triggerFailure;
|
||||||
{
|
|
||||||
DownloadFailed?.Invoke(request);
|
|
||||||
|
|
||||||
if (error is OperationCanceledException) return;
|
|
||||||
|
|
||||||
notification.State = ProgressNotificationState.Cancelled;
|
|
||||||
Logger.Error(error, $"{HumanisedModelName.Titleize()} download failed!");
|
|
||||||
currentDownloads.Remove(request);
|
|
||||||
};
|
|
||||||
|
|
||||||
notification.CancelRequested += () =>
|
notification.CancelRequested += () =>
|
||||||
{
|
{
|
||||||
@ -108,11 +99,31 @@ namespace osu.Game.Database
|
|||||||
currentDownloads.Add(request);
|
currentDownloads.Add(request);
|
||||||
PostNotification?.Invoke(notification);
|
PostNotification?.Invoke(notification);
|
||||||
|
|
||||||
Task.Factory.StartNew(() => request.Perform(api), TaskCreationOptions.LongRunning);
|
Task.Factory.StartNew(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
request.Perform(api);
|
||||||
|
}
|
||||||
|
catch (Exception error)
|
||||||
|
{
|
||||||
|
triggerFailure(error);
|
||||||
|
}
|
||||||
|
}, TaskCreationOptions.LongRunning);
|
||||||
|
|
||||||
DownloadBegan?.Invoke(request);
|
DownloadBegan?.Invoke(request);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
void triggerFailure(Exception error)
|
||||||
|
{
|
||||||
|
DownloadFailed?.Invoke(request);
|
||||||
|
|
||||||
|
if (error is OperationCanceledException) return;
|
||||||
|
|
||||||
|
notification.State = ProgressNotificationState.Cancelled;
|
||||||
|
Logger.Error(error, $"{HumanisedModelName.Titleize()} download failed!");
|
||||||
|
currentDownloads.Remove(request);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsAvailableLocally(TModel model) => CheckLocalAvailability(model, modelStore.ConsumableItems.Where(m => !m.DeletePending));
|
public bool IsAvailableLocally(TModel model) => CheckLocalAvailability(model, modelStore.ConsumableItems.Where(m => !m.DeletePending));
|
||||||
|
@ -44,7 +44,17 @@ namespace osu.Game.Overlays.Changelog
|
|||||||
req.Failure += _ => complete = true;
|
req.Failure += _ => complete = true;
|
||||||
|
|
||||||
// This is done on a separate thread to support cancellation below
|
// This is done on a separate thread to support cancellation below
|
||||||
Task.Run(() => req.Perform(api));
|
Task.Run(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
req.Perform(api);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
complete = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
while (!complete)
|
while (!complete)
|
||||||
{
|
{
|
||||||
|
@ -170,6 +170,7 @@ namespace osu.Game.Overlays
|
|||||||
var tcs = new TaskCompletionSource<bool>();
|
var tcs = new TaskCompletionSource<bool>();
|
||||||
|
|
||||||
var req = new GetChangelogRequest();
|
var req = new GetChangelogRequest();
|
||||||
|
|
||||||
req.Success += res => Schedule(() =>
|
req.Success += res => Schedule(() =>
|
||||||
{
|
{
|
||||||
// remap streams to builds to ensure model equality
|
// remap streams to builds to ensure model equality
|
||||||
@ -183,8 +184,22 @@ namespace osu.Game.Overlays
|
|||||||
|
|
||||||
tcs.SetResult(true);
|
tcs.SetResult(true);
|
||||||
});
|
});
|
||||||
req.Failure += _ => initialFetchTask = null;
|
|
||||||
|
req.Failure += _ =>
|
||||||
|
{
|
||||||
|
initialFetchTask = null;
|
||||||
|
tcs.SetResult(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
req.Perform(API);
|
req.Perform(API);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
initialFetchTask = null;
|
||||||
|
tcs.SetResult(false);
|
||||||
|
}
|
||||||
|
|
||||||
await tcs.Task;
|
await tcs.Task;
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user