Saturday, 15 September 2012

Error-Handling in Swift-Language -



Error-Handling in Swift-Language -

i haven't read much swift 1 thing noticed there no exceptions. how error handling in swift? has found error-handling?

runtime errors:

as leandros suggests handling runtime errors (like network connectivity problems, parsing data, opening file, etc) should utilize nserror did in objc, because foundation, appkit, uikit, etc study errors in way. it's more framework thing language thing.

another frequent pattern beingness used separator success/failure blocks in afnetworking:

var sessionmanager = afhttpsessionmanager(baseurl: nsurl(string: "yavin4.yavin.planets")) sessionmanager.head("/api/destorydeathstar", parameters: xwingsquad, success: { (nsurlsessiondatatask) -> void in println("success") }, failure:{ (nsurlsessiondatatask, nserror) -> void in println("failure") })

still failure block received nserror instance, describing error.

programmer errors:

for programmer errors (like out of bounds access of array element, invalid arguments passed function call, etc) used exceptions in objc. swift language not seem have language back upwards exceptions (like throw, catch, etc keyword). however, documentation suggests running on same runtime objc, , hence still able throw nsexceptions this:

nsexception(name: "somename", reason: "somereason", userinfo: nil).raise()

you cannot grab them in pure swift, although may opt catching exceptions in objc code.

the questions whether should throw exceptions programmer errors, or rather utilize assertions apple suggests in language guide.

swift 2.0 update

things have changed bit in swift 2.0, there new error-handling mechanism, more similar exceptions different in detail.

indicating error possibility

if function/method wants indicate may throw error, should contain throws keyword

func ridethedragon() throws { ... }

note: there no specification of function can throw, either throwing error or not throwing @ all.

invoking function may throw errors

in order invoke function need utilize seek keyword, this

try ridethedragon(dragon: dragon)

this line should nowadays do-catch block this

do { seek ridethedragon(reddragon) } grab dragonerror.dragonismissing { // error-handling } grab dragonerror.notenoughmana(let manarequired) { // more error-handlng } grab { // grab error-handling }

note: grab clause utilize powerful features of swift pattern matching flexible here.

alternatively in function marked throws keyword this

func fullfillquest(quest: quest) throws { seek ridethedragon(quest.dragon) }

last not least, can decide know error not occur, e.g. because have checked prerequisites, , utilize try! keyword.

try! ridethedragon(goldendragon)

if function throws error, you'll runtime error in application.

throwing error

in order throw error utilize throw keyword this

throw dragonerror.dragonismissing

you can throw conforms errortype protocol. starters nserror conforms protocol go enum-based errortype enables grouping multiple related errors, potentially additional pieces of data, this

enum dragonerror: errortype { case dragonismissing case notenoughmana(manarequired: int) ... }

main differences between new swift 2.0 error mechanism , java/c#/c++ style exceptions follows:

syntax bit different: do-catch + try + defer vs traditional try-catch-finally syntax. exception handling incurs much higher execution time in exception path in success path. not case swift 2.0 errors, success path , error path cost same. all error throwing code must declared, while exceptions might have been thrown anywhere. errors "checked exceptions" in java nomenclature. however, in contrast java, not specify potentially thrown errors. swift exceptions not compatible objc exceptions. do-catch block not grab nsexception, , vice versa, must utilize objc. swift exceptions compatible cocoa nserror method conventions of returning either false (for bool returning functions) or nil (for anyobject returning functions) , passing nserrorpointer error details.

as syntatic-sugar ease error handling, there 2 more concepts

deferred actions (using defer keyword) allow accomplish same effect blocks in java/c#/etc guard statement (using guard keyword) allow write little less if/else code in normal error checking/signaling code.

swift

No comments:

Post a Comment