Skip to content

Commit 2ca52fc

Browse files
authored
Merge pull request ClickHouse#1582 from zalj/main
Using a more elegant Pattern-Matcher method to extract error code from error message
2 parents cee9a65 + c388958 commit 2ca52fc

File tree

2 files changed

+31
-20
lines changed

2 files changed

+31
-20
lines changed

clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseException.java

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import java.net.UnknownHostException;
66
import java.util.Locale;
77
import java.util.concurrent.TimeoutException;
8+
import java.util.regex.Matcher;
9+
import java.util.regex.Pattern;
810

911
/**
1012
* Exception thrown from ClickHouse server. See full list at
@@ -28,6 +30,7 @@ public class ClickHouseException extends Exception {
2830

2931
static final String MSG_CODE = "Code: ";
3032
static final String MSG_CONNECT_TIMED_OUT = "connect timed out";
33+
static final Pattern ERROR_CODE_PATTERN = Pattern.compile("Code:[ ]*(\\d+)");
3134

3235
private final int errorCode;
3336

@@ -60,27 +63,10 @@ private static String buildErrorMessage(int code, String message, ClickHouseNode
6063
private static int extractErrorCode(String errorMessage) {
6164
if (errorMessage == null || errorMessage.isEmpty()) {
6265
return ERROR_UNKNOWN;
63-
} else if (errorMessage.startsWith("Poco::Exception. Code: 1000, ")) {
64-
return ERROR_POCO;
6566
}
66-
67-
int startIndex = errorMessage.indexOf(' ');
68-
if (startIndex >= 0) {
69-
for (int i = ++startIndex, len = errorMessage.length(); i < len; i++) {
70-
char ch = errorMessage.charAt(i);
71-
if (ch == '.' || ch == ',' || Character.isWhitespace(ch)) {
72-
try {
73-
return Integer.parseInt(errorMessage.substring(startIndex, i));
74-
} catch (NumberFormatException e) {
75-
// ignore
76-
}
77-
break;
78-
}
79-
}
80-
}
81-
82-
// this is confusing as usually it's a client-side exception
83-
return ERROR_UNKNOWN;
67+
Matcher matcher = ERROR_CODE_PATTERN.matcher(errorMessage);
68+
// when not match, this is confusing as usually it's a client-side exception
69+
return matcher.find() ? Integer.parseInt(matcher.group(1)) : ERROR_UNKNOWN;
8470
}
8571

8672
static Throwable getRootCause(Throwable t) {

clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseExceptionTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,31 @@ public void testHandleException() {
106106
Assert.assertEquals(e.getErrorCode(), 12345);
107107
Assert.assertEquals(e.getCause(), cause.getCause());
108108
Assert.assertEquals(e.getMessage(), cause.getCause().getMessage() + ", server " + server);
109+
110+
cause = new ExecutionException(new IllegalArgumentException("Code:12345. Something goes wrong..."));
111+
e = ClickHouseException.of(cause, server);
112+
Assert.assertEquals(e.getErrorCode(), 12345);
113+
Assert.assertEquals(e.getCause(), cause.getCause());
114+
Assert.assertEquals(e.getMessage(), cause.getCause().getMessage() + ", server " + server);
115+
116+
cause = new ExecutionException(new IllegalArgumentException("Poco::Exception. Code: 1000, "));
117+
e = ClickHouseException.of(cause, server);
118+
Assert.assertEquals(e.getErrorCode(), 1000);
119+
Assert.assertEquals(e.getCause(), cause.getCause());
120+
Assert.assertEquals(e.getMessage(), cause.getCause().getMessage() + ", server " + server);
121+
122+
cause = new ExecutionException(new IllegalArgumentException("Code: 123"));
123+
e = ClickHouseException.of(cause, server);
124+
Assert.assertEquals(e.getErrorCode(), 123);
125+
Assert.assertEquals(e.getCause(), cause.getCause());
126+
Assert.assertEquals(e.getMessage(), cause.getCause().getMessage() + ", server " + server);
127+
128+
cause = new ExecutionException(new IllegalArgumentException("Code: ab123"));
129+
e = ClickHouseException.of(cause, server);
130+
Assert.assertEquals(e.getErrorCode(), 1002);
131+
Assert.assertEquals(e.getCause(), cause.getCause());
132+
Assert.assertEquals(e.getMessage(), cause.getCause().getMessage() + ", server " + server);
133+
109134
}
110135

111136
@Test(groups = { "unit" })

0 commit comments

Comments
 (0)