【发布时间】:2019-07-24 08:22:22
【问题描述】:
我有一个类型的枚举:
enum class DataType {
BOOLEAN,
DOUBLE,
STRING,
TIMESTAMP
}
和数据类:
data class Entity(
@Id
val id: UUID,
val name: String,
val properties: List<Property>
)
data class Property(
val name: String,
val value: String
)
我有 EntityType 类,它为每个属性定义属性名称和类型:
data class EntityType(
@Id
val id: UUID,
val name: String,
val properties: List<PropertyDefinition>
)
data class PropertyDefinition(
val name: String,
val dataType: DataType
)
我想根据它的EntityType保存必备属性的每个实体。我想验证实体属性中的每个属性。接下来我做:
val entityPropertiesMap = entity.properties.map { Pair(it.name, it) }.toMap()
entityTypeProperties.forEach {
try {
when (it.dataType) {
DataType.BOOLEAN -> checkBoolean(property.value)
DataType.DOUBLE -> property.value.toDouble()
DataType.TIMESTAMP -> Instant.parse(property.value)
DataType.STRING -> if (!property.value.matches(Regex("[a-zA-Z0-9-_.]+"))) {
throw WrongPropertyValuePatternException("Entity property value '${property.value}' does not match with the pattern [a-zA-Z0-9-_.]+")
}
}
} catch (e: Exception) {
when (e) {
is NumberFormatException, is DateTimeParseException, is WrongBooleanFormatException ->
throw EntityPropertyCastException("Property '${property.name}' with value '${property.value}' can't be casted to ${it.dataType}.")
is WrongPropertyValuePatternException -> throw e
else -> throw e
}
}
}
如您所见,我正在尝试解析值,如果出现错误,我会捕获异常。我不会写
DataType.DOUBLE -> if (!(property.value is Double)) throw SomeMyException("...")
因为property.value 始终是字符串。如何在不捕获解析异常的情况下验证类型?还是像我一样做是正常的做法?
【问题讨论】:
标签: json exception kotlin casting type-conversion