Посібник для початківців із обробки помилок TypeScript

Ефективна обробка помилок є надзвичайно важливою для будь-якої мови програмування, і TypeScript не є винятком. Належна обробка помилок допомагає створювати стійкі та надійні додатки шляхом ефективного керування неочікуваними умовами. Цей посібник охоплює основи обробки помилок у TypeScript і надає практичні приклади для початківців.

Розуміння помилок у TypeScript

Помилки в TypeScript, як і в JavaScript, виникають під час виконання або під час компіляції. TypeScript забезпечує безпеку типів, яка може виявити багато потенційних проблем під час компіляції, але помилки під час виконання все одно потребують належного керування.

Основна обробка помилок за допомогою try і catch

У TypeScript ви обробляєте помилки виконання за допомогою блоків try і catch. Цей підхід дозволяє вам виконувати код, який може викликати помилку, і обробляти цю помилку, якщо вона виникає.

Приклад try і catch

function divide(a: number, b: number): number {
  try {
    if (b === 0) {
      throw new Error("Cannot divide by zero");
    }
    return a / b;
  } catch (error) {
    console.error(error.message);
    return NaN; // Return NaN to indicate an error
  }
}

console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Cannot divide by zero

У цьому прикладі функція divide намагається поділити два числа. Якщо дільник дорівнює нулю, виникає помилка, яка перехоплюється блоком catch, який записує повідомлення про помилку.

Спеціальні типи помилок

TypeScript дозволяє визначати власні типи помилок для кращого представлення конкретних умов помилки. Спеціальні типи помилок допомагають класифікувати помилки та ефективніше їх опрацьовувати.

Створення спеціального типу помилки

class DivisionError extends Error {
  constructor(message: string) {
    super(message);
    this.name = "DivisionError";
  }
}

function divide(a: number, b: number): number {
  try {
    if (b === 0) {
      throw new DivisionError("Cannot divide by zero");
    }
    return a / b;
  } catch (error) {
    if (error instanceof DivisionError) {
      console.error(`Custom Error: ${error.message}`);
    } else {
      console.error("An unexpected error occurred");
    }
    return NaN; // Return NaN to indicate an error
  }
}

console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Custom Error: Cannot divide by zero

Тут ми визначаємо спеціальний клас помилок DivisionError, який розширює вбудований клас Error. Ми використовуємо цю спеціальну помилку у функції divide, щоб забезпечити точнішу обробку помилок.

Введіть Guarding з instanceof

Захист типу instanceof допомагає звузити тип об’єкта помилки в блоці catch, дозволяючи вам по-різному обробляти різні типи помилок.

Приклад типу Guarding

function processInput(input: string | number) {
  try {
    if (typeof input === "string") {
      console.log(input.toUpperCase());
    } else {
      throw new Error("Input must be a string");
    }
  } catch (error) {
    if (error instanceof Error) {
      console.error(`Error: ${error.message}`);
    } else {
      console.error("An unknown error occurred");
    }
  }
}

processInput("hello"); // Output: HELLO
processInput(42); // Output: Error: Input must be a string

Цей приклад демонструє захист типу в блоці catch, щоб гарантувати, що об’єкт помилки є екземпляром Error, що забезпечує точну обробку помилок.

Використання finally для очищення

Блок finally можна використовувати для виконання коду, який має виконуватися незалежно від того, сталася помилка чи ні. Це корисно для операцій очищення, таких як закриття файлів або звільнення ресурсів.

Приклад з finally

function readFile(filePath: string): string {
  try {
    // Simulate reading a file
    if (filePath === "") {
      throw new Error("File path cannot be empty");
    }
    return "File content";
  } catch (error) {
    console.error(`Error: ${error.message}`);
    return "";
  } finally {
    console.log("Cleanup: Closing file");
  }
}

console.log(readFile("path/to/file")); // Output: File content
console.log(readFile("")); // Output: Error: File path cannot be empty
                            //         Cleanup: Closing file

У цьому прикладі блок finally забезпечує реєстрацію повідомлення про очищення незалежно від того, чи сталася помилка.

Висновок

Ефективна обробка помилок має вирішальне значення для створення надійних програм TypeScript. Використовуючи try і catch, користувальницькі типи помилок, захист типів і finally, ви можете ефективніше керувати помилками та забезпечити передбачувану поведінку вашої програми навіть у обличчя несподіваних умов.

За допомогою цих методів ви можете витончено обробляти помилки та покращити надійність коду TypeScript. Практикуйте ці концепції, щоб навчитися обробці помилок TypeScript і писати більш стійкі додатки.