Skip to content

Commit 1ef79ea

Browse files
authored
Error handling parity (#237)
* feat: update AnalyticsErrors to match Swift version. * feat: wrap NetworkUnknown error in a SettingsFail Error.
1 parent 745c7a4 commit 1ef79ea

File tree

2 files changed

+39
-27
lines changed

2 files changed

+39
-27
lines changed

core/src/main/java/com/segment/analytics/kotlin/core/Errors.kt

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,33 @@
11
package com.segment.analytics.kotlin.core
22

33
import com.segment.analytics.kotlin.core.platform.plugins.logger.segmentLog
4+
import java.net.URL
5+
46
sealed class AnalyticsError(): Throwable() {
57
data class StorageUnableToCreate(override val message: String?): AnalyticsError()
68
data class StorageUnableToWrite(override val message: String?): AnalyticsError()
79
data class StorageUnableToRename(override val message: String?): AnalyticsError()
810
data class StorageUnableToOpen(override val message: String?): AnalyticsError()
911
data class StorageUnableToClose(override val message: String?): AnalyticsError()
1012
data class StorageInvalid(override val message: String?): AnalyticsError()
11-
data class StorageUnknown(override val message: String?, override val cause: Throwable?): AnalyticsError()
12-
data class NetworkUnexpectedHTTPCode(override val message: String?): AnalyticsError()
13-
data class NetworkServerLimited(override val message: String?): AnalyticsError()
14-
data class NetworkServerRejected(override val message: String?): AnalyticsError()
15-
data class NetworkUnknown(override val message: String?, override val cause: Throwable?): AnalyticsError()
13+
data class StorageUnknown(override val cause: Throwable?): AnalyticsError()
14+
15+
data class NetworkUnexpectedHTTPCode(val uri: URL?, val code: Int): AnalyticsError()
16+
data class NetworkServerLimited(val uri: URL?, val code: Int): AnalyticsError()
17+
data class NetworkServerRejected(val uri: URL?, val code: Int): AnalyticsError()
18+
data class NetworkUnknown(val uri: URL?, override val cause: Throwable?): AnalyticsError()
1619
data class NetworkInvalidData(override val message: String?): AnalyticsError()
17-
data class JsonUnableToSerialize(override val message: String?, override val cause: Throwable?): AnalyticsError()
18-
data class JsonUnableToDeserialize(override val message: String?, override val cause: Throwable?): AnalyticsError()
19-
data class JsonUnknown(override val message: String?, override val cause: Throwable?): AnalyticsError()
20-
data class PluginError(override val message: String?, override val cause: Throwable?): AnalyticsError()
21-
data class EnrichmentError(override val message: String?): AnalyticsError()
22-
data class SettingsFetchError(override val message: String?, override val cause: Throwable?): AnalyticsError()
20+
21+
data class JsonUnableToSerialize(override val cause: Throwable?): AnalyticsError()
22+
data class JsonUnableToDeserialize(override val cause: Throwable?): AnalyticsError()
23+
data class JsonUnknown(override val cause: Throwable?): AnalyticsError()
24+
25+
data class PluginError(override val cause: Throwable?): AnalyticsError()
26+
27+
data class EnrichmentError(override val message: String): AnalyticsError()
28+
29+
data class SettingsFail(override val cause: AnalyticsError): AnalyticsError()
30+
data class BatchUploadFail(override val cause: AnalyticsError): AnalyticsError()
2331
}
2432

2533
/**

core/src/main/java/com/segment/analytics/kotlin/core/Settings.kt

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ package com.segment.analytics.kotlin.core
22

33
import com.segment.analytics.kotlin.core.platform.DestinationPlugin
44
import com.segment.analytics.kotlin.core.platform.Plugin
5-
import com.segment.analytics.kotlin.core.platform.plugins.logger.LogKind
65
import com.segment.analytics.kotlin.core.platform.plugins.logger.log
7-
import com.segment.analytics.kotlin.core.platform.plugins.logger.segmentLog
86
import com.segment.analytics.kotlin.core.utilities.LenientJson
97
import com.segment.analytics.kotlin.core.utilities.safeJsonObject
108
import kotlinx.coroutines.launch
@@ -15,6 +13,7 @@ import kotlinx.serialization.json.Json
1513
import kotlinx.serialization.json.JsonObject
1614
import kotlinx.serialization.serializer
1715
import java.io.BufferedReader
16+
import java.net.URL
1817

1918
@Serializable
2019
data class Settings(
@@ -109,17 +108,22 @@ internal fun Analytics.fetchSettings(
109108
writeKey: String,
110109
cdnHost: String
111110
): Settings? = try {
112-
val connection = HTTPClient(writeKey, this.configuration.requestFactory).settings(cdnHost)
113-
val settingsString =
114-
connection.inputStream?.bufferedReader()?.use(BufferedReader::readText) ?: ""
115-
log("Fetched Settings: $settingsString")
116-
LenientJson.decodeFromString(settingsString)
117-
} catch (ex: Exception) {
118-
reportErrorWithMetrics(this, AnalyticsError.SettingsFetchError(ex.message, ex), "Failed to fetch settings",
119-
Telemetry.INVOKE_ERROR_METRIC, ex.stackTraceToString()) {
120-
it["error"] = ex.toString()
121-
it["writekey"] = writeKey
122-
it["message"] = "Error retrieving settings"
123-
}
124-
configuration.defaultSettings
125-
}
111+
val connection = HTTPClient(writeKey, this.configuration.requestFactory).settings(cdnHost)
112+
val settingsString =
113+
connection.inputStream?.bufferedReader()?.use(BufferedReader::readText) ?: ""
114+
log("Fetched Settings: $settingsString")
115+
LenientJson.decodeFromString(settingsString)
116+
} catch (ex: Exception) {
117+
reportErrorWithMetrics(
118+
this,
119+
AnalyticsError.SettingsFail(AnalyticsError.NetworkUnknown(URL("https://$cdnHost/projects/$writeKey/settings"), ex)),
120+
"Failed to fetch settings",
121+
Telemetry.INVOKE_ERROR_METRIC,
122+
ex.stackTraceToString()
123+
) {
124+
it["error"] = ex.toString()
125+
it["writekey"] = writeKey
126+
it["message"] = "Error retrieving settings"
127+
}
128+
configuration.defaultSettings
129+
}

0 commit comments

Comments
 (0)