Skip to main content

Swift Errors Handling

Error handling is an mechanism to control error situation at runtime. This error is based on logical condition and system failure situation. This error is also known as Exception Because that are terminates program execution abnormally. That are very dangerous because that are occur during program execution and one exception can destroy the flow of execution.

Generally exception are occured of two main reason. First is logical error and second is system failure. logical error are occurred unaccepted operation and input results, And other is system resources fail by any outer interrupts. So programer are responsible to handle first type of exception logical system failure situation. Because second type of exception is based on system resource and environment.

Swift is providing a mechanism to handle unaccepted logical situation those to control unwanted error colossally. This mechanism is called error handling.

//Error controle case
enum ErrorList:Error{
    case divideByZero
}
//Divide a number
func divide(dividend:Int ,divisor:Int) throws -> Int{

    if(divisor==0){
        throw ErrorList.divideByZero
    }else{
        return dividend / divisor
    }
}
do{
    var result = try divide(dividend:12,divisor:4)
    print("Case 1 result : \(result)")

    result = try divide(dividend:12,divisor:0)
    print("Case 2 result : \(result)")
    
}catch ErrorList.divideByZero{
    //Catch custom error
    print("You can't divide a number by zero ")

}

Output

Case 1 result : 3
You can't divide a number by zero 

Note that we can handle most of logical error by using if-else condition but that is not suitable for all development process. This exception handling mechanism are useful to clear indication of codes.

enum ErrorReport:Error{
    case missingValue(String)
}
do{
   let a=""
   if(a==""){
        throw ErrorReport.missingValue("value are missing")
   }
   else{
        print("\(a)")
   }
}catch let error{
    print("\(error)")
}

Output

missingValue("value are missing")

Example

//Handle mutiple error
enum ErrorReport:Error{
    case missingValue
    case divideByZero
    case invalidDiscount(discount:Int)
}
class Product{
    
    var name :  String
    var price : Double
    var discount : Double

    init(_ name:String,_ price:Double) throws{
        guard name != "" else{
            //When not provide product name
            throw ErrorReport.missingValue
        }
        self.discount=0.0
        self.name=name
        self.price=price
    }
    func discountPay(_ discount:Int) throws{
        // Ensure that valid discount
        guard discount < 100 else {
            //When discount rate exceed limit
            throw ErrorReport.invalidDiscount(discount:discount)
        }
        let doubleValue=Double(discount)
        self.discount=(price*doubleValue)/100
    }
    func details(){
        print("Product Name : \(name)")
        print("Product Price : \(price)")
        print("Product Discount : \(discount)")
    }
}
do{
    //Case 1
    print("Pen Drive Details")
    let penDrive = try Product("Pen Drive",100)
    try penDrive.discountPay(50) //Set % of discount
    penDrive.details()

    //Case 2
    print("iPhone Details")
    let iphone = try Product("I phone",78000)
    try iphone.discountPay(110) //Set % of discount
    iphone.details() //When no error

}catch let error as ErrorReport {
    //Handle the multiple user defined errors
    switch(error){

        case .missingValue:
            print("Missing name")
        case .divideByZero:
            print("Divide by Zero") 
        case .invalidDiscount(let discount):
            print("Invalid Discount : \(discount) % ")      
    }
}

Output

Pen Drive Details
Product Name : Pen Drive
Product Price : 100.0
Product Discount : 50.0
iPhone Details
Invalid Discount : 110 % 




Comment

Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.

New Comment