debugswiftMinor
Error handler for HomeKit app
Viewed 0 times
errorhomekitappforhandler
Problem
I have this universal error handler for my HomeKit app (currently in development). It grew out of wanting a single place to write error messages, show alerts, etc. I wanted a short, simple way to call it from anywhere that may generate an error.
Here's the class:
I call it from other code like this:
My concerns:
Here's the class:
import UIKit
import HomeKit
class ESErrorHandler : NSObject
{
class func handleError(error: NSError) -> Bool
{
NSLog("Handling error \(error) in centralized handler")
let code = HMErrorCode(rawValue: error.code)
switch code! {
case HMErrorCode.FireDateInPast:
showAlertWithTitle("Invalid date", body: "Date must be in the future")
case HMErrorCode.AccessDenied:
showAlertWithTitle("Access Denied", body: "You don't have permission to access the specified item")
... // A bunch more cases
default:
NSLog("Couldn't handle error with code \(error.code)")
showAlertWithTitle("Error", body: "Couldn't successfully complete action")
return false
}
return true
}
class func showAlertWithTitle(title: NSString, body: NSString)
{
dispatch_async(dispatch_get_main_queue())
{
let alert = UIAlertView(title: title, message: body, delegate: nil, cancelButtonTitle: "OK")
alert.show()
}
}
}I call it from other code like this:
homeManager.addHomeWithName(currentHouseName) {(home: HMHome!, error: NSError!) in
if error != nil
{
ESErrorHandler.handleError(error)
self.title = "Add Home"
}
else
{
... //Stuff worked, do other stuff
}
}My concerns:
- Something feels wrong about putting using a class method for
showAlertWithTitle:body:
- I don't really like having using
switch code!, it seems clumsy like I'm missing something in unwrapping
Solution
I don't really like having using
I'm missing something in unwrapping.
Yes, that will crash if the function is called with an error code
that does not correspond to one of the
Better use optional binding with
It is also not obvious from your code why the function has a (boolean) return
value, as the caller ignores it.
switch code!, it seems clumsy likeI'm missing something in unwrapping.
Yes, that will crash if the function is called with an error code
that does not correspond to one of the
HMErrorCode enumeration values.Better use optional binding with
if let ...:class func handleError(error: NSError) -> Bool
{
if let code = HMErrorCode(rawValue: error.code) {
switch code {
case HMErrorCode.FireDateInPast:
showAlertWithTitle("Invalid date", body: "Date must be in the future")
case HMErrorCode.AccessDenied:
showAlertWithTitle("Access Denied", body: "You don't have permission to access the specified item")
// Other cases ...
default:
NSLog("Couldn't handle error with code \(error.code)")
showAlertWithTitle("Error", body: "Couldn't successfully complete action")
return false
}
} else {
NSLog("Unknown error with code \(error.code)")
showAlertWithTitle("Error", body: "Unknown error \(error.code)")
return false
}
return true
}It is also not obvious from your code why the function has a (boolean) return
value, as the caller ignores it.
Code Snippets
class func handleError(error: NSError) -> Bool
{
if let code = HMErrorCode(rawValue: error.code) {
switch code {
case HMErrorCode.FireDateInPast:
showAlertWithTitle("Invalid date", body: "Date must be in the future")
case HMErrorCode.AccessDenied:
showAlertWithTitle("Access Denied", body: "You don't have permission to access the specified item")
// Other cases ...
default:
NSLog("Couldn't handle error with code \(error.code)")
showAlertWithTitle("Error", body: "Couldn't successfully complete action")
return false
}
} else {
NSLog("Unknown error with code \(error.code)")
showAlertWithTitle("Error", body: "Unknown error \(error.code)")
return false
}
return true
}Context
StackExchange Code Review Q#67937, answer score: 4
Revisions (0)
No revisions yet.