Skip to content

Commit 0286f96

Browse files
committed
Implement self-handling exceptions
1 parent fce7ebf commit 0286f96

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

common/src/main/java/revxrsal/commands/exception/CommandExceptionAdapter.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ public void sendableException(@NotNull CommandActor actor, @NotNull SendableExce
115115
private static final List<Method> IGNORED_METHODS = new ArrayList<>();
116116

117117
static {
118-
Method onUnhandledException = null, handleException = null;
119118
for (Method method : CommandExceptionAdapter.class.getDeclaredMethods()) {
120119
if (method.getParameterCount() != 2) continue;
121120
if (method.isAnnotationPresent(Ignore.class))
@@ -125,7 +124,10 @@ public void sendableException(@NotNull CommandActor actor, @NotNull SendableExce
125124

126125
@Override @Ignore public void handleException(@NotNull Throwable throwable, @NotNull CommandActor actor) {
127126
MethodExceptionHandler handler = handlers.getFlexibleOrDefault(throwable.getClass(), unknownHandler);
128-
handler.handle(actor, throwable);
127+
if (handler == unknownHandler && throwable instanceof SelfHandledException)
128+
((SelfHandledException) throwable).handle(actor);
129+
else
130+
handler.handle(actor, throwable);
129131
}
130132

131133
public CommandExceptionAdapter() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* This file is part of lamp, licensed under the MIT License.
3+
*
4+
* Copyright (c) Revxrsal <reflxction.github@gmail.com>
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* The above copyright notice and this permission notice shall be included in all
14+
* copies or substantial portions of the Software.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22+
* SOFTWARE.
23+
*/
24+
package revxrsal.commands.exception;
25+
26+
import revxrsal.commands.command.CommandActor;
27+
28+
/**
29+
* An interface designed for exceptions that wish to handle themselves, without
30+
* having to be explicitly handled by an exception adapter.
31+
* <p>
32+
* This interface should <em>only</em> be implemented by exceptions,
33+
* as it does not expose any information about the exception being handled.
34+
*/
35+
public interface SelfHandledException {
36+
37+
/**
38+
* Handles the exception.
39+
*
40+
* @param actor The command actor
41+
*/
42+
void handle(CommandActor actor);
43+
44+
}

0 commit comments

Comments
 (0)