Skip to content

Error Handling and Edge Cases

Gracefully handling errors, edge cases, and validation in Canon applications

ts
const validEntity = {
id: 'user-123',
type: 'user',
version: 5,
createdAt: new Date('2024-01-15T10:30:00Z'),
createdBy: 'admin-456',
}
ts
const missingFields = {
name: 'Incomplete User',
email: 'incomplete@example.com',
}
ts
const wrongTypes = {
id: 123,
type: true,
version: 'five',
}
ts
const nullValues = {
id: null,
version: 0,
}
ts
const emptyObject = {}
ts
const nonObject = 'not an object'
ts
const nestedObject = {
user: {
  id: 'user-456',
  type: 'user',
  version: 3,
},
metadata: {
  source: 'api',
  timestamp: '2024-01-15T10:30:00Z',
},
}

handles valid entities correctly:

ts
const id = safeIdOf(validEntity)
const type = safeTypeOf(validEntity)
const version = safeVersionOf(validEntity)

expect(id).toBe('user-123')
expect(type).toBe('user')
expect(version).toBe(5)

handles missing fields gracefully:

ts
const id = safeIdOf(missingFields)
const type = safeTypeOf(missingFields)
const version = safeVersionOf(missingFields)

expect(id).toBeUndefined()
expect(type).toBeUndefined()
expect(version).toBeUndefined()

handles wrong field types gracefully:

ts
const id = safeIdOf(wrongTypes)
const type = safeTypeOf(wrongTypes)
const version = safeVersionOf(wrongTypes)

expect(id).toBeUndefined()
expect(type).toBeUndefined()
// versionOf returns the actual value when it's not a number, safeVersionOf returns undefined
expect(version).toBeUndefined()

handles null and undefined values:

ts
const id = safeIdOf(nullValues)
const type = safeTypeOf(nullValues)
const version = safeVersionOf(nullValues)

expect(id).toBeUndefined()
expect(type).toBeUndefined()
// The nullValues object has version: 0, which is a valid number, so safeVersionOf returns 0
expect(version).toBe(0)

handles empty objects:

ts
const id = safeIdOf(emptyObject)
const type = safeTypeOf(emptyObject)
const version = safeVersionOf(emptyObject)

expect(id).toBeUndefined()
expect(type).toBeUndefined()
expect(version).toBeUndefined()

handles non-object values:

ts
const id = safeIdOf(nonObject)
const type = safeTypeOf(nonObject)
const version = safeVersionOf(nonObject)

expect(id).toBeUndefined()
expect(type).toBeUndefined()
expect(version).toBeUndefined()

validates entities correctly:

ts
const validResult = validateEntity(validEntity)
const invalidResult = validateEntity(missingFields)

expect(validResult.isValid).toBe(true)
expect(validResult.errors).toHaveLength(0)

expect(invalidResult.isValid).toBe(false)
expect(invalidResult.errors.length).toBeGreaterThan(0)

processes entities safely:

ts
const validResult = processEntitySafely(validEntity)
const invalidResult = processEntitySafely(missingFields)

expect(validResult.success).toBe(true)
expect(validResult.result?.id).toBe('user-123')

expect(invalidResult.success).toBe(false)
expect(invalidResult.errors.length).toBeGreaterThan(0)

processes batch entities correctly:

ts
const batchResult = processBatchSafely([validEntity, missingFields, wrongTypes, nullValues])

expect(batchResult.successful).toBe(1)
expect(batchResult.failed).toBe(3)
expect(batchResult.results).toHaveLength(4)

handles timestamp conversion errors:

ts
const validTimestamp = safeTimestampConversion('2024-01-15T10:30:00Z')
const invalidTimestamp = safeTimestampConversion('not a date')

expect(validTimestamp).toBeInstanceOf(Date)
expect(invalidTimestamp).toBeUndefined()

handles reference conversion errors:

ts
const validReference = safeReferenceConversion('user-123')
const invalidReference = safeReferenceConversion(123)

expect(validReference).toEqual({ ref: 'user-123', resolved: false })
expect(invalidReference).toBeUndefined()

References

Source: View on GitHub

Metadata

Keywords: error-handling, validation, edge-cases, safe-functions, robustness Difficulty: intermediate

Released under the MIT License.