Sobes.tech
Junior

Ինչպես հայտնաբերել սխալները Swift-ում?

sobes.tech AI

Պատասխան AI-ից

Swift-ում սխալները բռնում են սխալների մշակման համակարգի միջոցով, որը հիմնված է throw, throws, try և do-catch բլոկների վրա:

  1. Սխալներ կրող ֆունկցիաների հայտարարում: Օգտագործվում է throws բանալի բառը ֆունկցիայի պարամետրերից հետո:

    enum DataError: Error {
        case emptyData
        case invalidFormat
    }
    
    func processData(input: String) throws -> String {
        guard !input.isEmpty else {
            throw DataError.emptyData // Խնդիրը նետում ենք
        }
        // ... տվյալների մշակման տրամաբանությունը ...
        if input == "invalid" {
             throw DataError.invalidFormat
        }
        return "Մշակված: \(input)"
    }
    
  2. Սխալներ նետող ֆունկցիաներ կանչելը: Օգտագործվում է try բանալի բառը:

    do { // Սխալների մշակման բլոկ
        let result = try processData(input: "valid data")
        print(result) // "Մշակված: valid data"
    } catch { // Սխալների բռնում
        print("Սխալ է տեղի ունեցել: \(error)")
    }
    
  3. Հատուկ սխալների բռնում: catch բլոկում կարելի է նշել կոնկրետ սխալի տիպը:

    do {
        let result = try processData(input: "")
        print(result)
    } catch DataError.emptyData {
        print("Տվյալները դատարկ են, խնդրում ենք մուտքագրել տվյալներ:")
    } catch DataError.invalidFormat {
        print("Տվյալների ձևաչափը անվավեր է:")
    } catch { // Բոլոր մյուս սխալները բռնել
        print("Անհայտ սխալ: \(error)")
    }
    
  4. defer բլոկ: Կատարվում է անմիջապես դուրս գալուց առաջ, անկախ այն բանից, տեղի է ունեցել սխալ կամ ոչ: Օգտագործվում է ռեսուրսների մաքրման համար:

    func openFile(_ filename: String) throws -> String {
        // Կարծում ենք, որ բացում է ֆայլը և վերադարձնում նրա պարունակությունը
        print("Բացում ֆայլը: \(filename)")
        // ... բացման տրամաբանությունը ...
    
        defer {
            // Այս կոդը կիրականացվի ֆունկցիայի դուրս գալուց առաջ,
            // նույնիսկ եթե սխալ լինի
            print("Փակում ֆայլը: \(filename)")
        }
    
        // ... ֆայլի մշակումը ...
        if filename == "error.txt" {
           throw DataError.invalidFormat // Խնդիրը նետում ենք
        }
    
        return "Ֆայլի պարունակությունը"
    }
    
    do {
        let content = try openFile("data.txt")
        print(content)
    } catch {
        print("Սխալ ֆայլի մշակման ժամանակ: \(error)")
    }
    
  5. Ընտրովի try?: Վերադարձնում է ընտրովի արժեք: Եթե ֆունկցիան նետում է սխալ, try? վերադարձնում է nil:

    let processedResult = try? processData(input: "") // processedResult կլինի nil
    let validResult = try? processData(input: "abc") // validResult կլինի ընտրովի String՝ արժեքով "Processed: abc"
    
  6. Համառ try!: Օգտագործվում է, երբ վստահ եք, որ սխալ չի լինի: Եթե սխալ լինի, ծրագիրը կավարտվի խափանմամբ:

    // Օգտագործեք միայն, եթե 100% վստահ եք, որ ֆունկցիան սխալ չի նետի
    let result = try! processData(input: "միշտ վավեր մուտքագրում")
    

do-catch համակարգը ավելի հստակ և անվտանգ է սխալների մշակման համար, քան ավանդական արտահայտությունները այլ լեզուներում, քանի որ այն պահանջում է բացահայտ հայտարարել այն ֆունկցիաները, որոնք կարող են նետել սխալ (throws), և բացահայտ մշակել այդ սխալները կանչի ժամանակ (try, do-catch).