精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

函數式 try-catch 如何轉變 JavaScript 代碼

開發 前端
我們并沒有丟棄它,而是將其轉化為更易維護和可預測的工具。 tryCatch()? 甚至只是許多使用像 try-catch 這樣的命令式構造的聲明式友好函數之一

這種情況有多常見?

function writeTransactionsToFile(transactions) {
  let writeStatus;
  try {
    fs.writeFileSync('transactions.txt', transactions);
    writeStatus = 'success';
  } catch (error) {
    writeStatus = 'error';
  }
  
  // do something with writeStatus...
}

這是另一個我們想要一個取決于是否存在異常的值的實例。

通常, 我們可能會在 try-catch 的范圍之外創建一個可變變量,以便在其中和之后無錯誤地訪問。

但情況并非總是這樣。只要有一個函數式的 try-catch 就不會這樣。

一個純粹的 tryCatch() 函數避免了可變變量,并在我們的代碼庫中鼓勵可維護性和可預測性。

沒有修改外部狀態 - tryCatch() 封裝了整個錯誤處理邏輯并產生單一輸出。

我們的 catch 變成了一個不需要大括號的單行代碼:

function writeTransactionsToFile(transactions) {
  // 我們現在可以使用 const 了
  const writeStatus = tryCatch({
    tryFn: () => {
      fs.writeFileSync('transactions.txt', transactions);
      return 'success';
    },
    catchFn: (error) => 'error'
  });

  // do something with writeStatus...
}

tryCatch() 函數

那么,這個 tryCatch() 函數究竟是什么樣子的呢?

從我們以上的使用方式,你已經可以猜到定義了:

function tryCatch({ tryFn, catchFn }) {
  try {
    return tryFn();
  } catch (error) {
    return catchFn(error);
  }
}

為了正確地講述函數的作用,我們確保使用對象參數來明確參數名稱——即使只有兩個屬性。

因為編程不僅僅是達到目的的手段 - 我們還在講述從開始到結束的代碼庫中的對象和數據的故事。

TypeScript 在這樣的情況下非常好用;我們看看一個泛型類型的 tryCatch() 可能是什么樣子:

type TryCatchProps<T> = {
  tryFn: () => T;
  catchFn: (error: any) => T;
};

function tryCatch<T>({ tryFn, catchFn }: TryCatchProps<T>): T {
  try {
    return tryFn();
  } catch (error) {
    return catchFn(error);
  }
}

我們用 TypeScript 重寫功能性 writeTransactionsToFile() :

function writeTransactionsToFile(transactions: string) {
  // 返回 'success' 或 'error'
  const writeStatus = tryCatch<'success' | 'error'>({
    tryFn: () => {
      fs.writeFileSync('transaction.txt', transactions);
      return 'success';
    },
    catchFn: (error) => return 'error';
  });

  // do something with writeStatus...
}

我們使用 'success' | 'error' 聯合類型來限制我們可以從 try 和 catch 回調中返回的字符串。

異步處理

不,我們完全不需要擔心這個問題 - 如果 tryFn 或 catchFn 是 async ,那么 writeTransactionToFile() 會自動返回一個 Promise 。

這是我們大多數人應該熟悉的另一個 try-catch 情況:發出網絡請求并處理錯誤。

在這里,我們根據請求是否成功來設置一個外部變量(在try-catch 之外)——在 React 應用中,我們可以輕松地用它設置狀態。

顯然,在真實世界的應用程序中,請求將會是異步的,以避免阻塞用戶界面線程:

async function comment(comment: string) {
  type Status = 'error' | 'success';
  let commentStatus: Status;
  try {
    const response = await fetch('https://api.mywebsite.com/comments', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({ comment }),
    });

    if (!response.ok) {
      commentStatus = 'error';
    } else {
      commentStatus = 'success';
    }
  } catch (error) {
    commentStatus = 'error';
  }

  // do something with commentStatus...
}

我們再次需要在這里創建一個可變變量,以便它可以進入 try-catch 并且沒有作用域錯誤地成功出來。

我們像以前一樣進行重構,這次,我們 async 了 try 和 catch 函數,從而 await 了 tryCatch() :

async function comment(comment: string) {
  type Status = 'error' | 'success';
  // ?? await because this returns Promise<Status>
  const commentStatus = await tryCatch<Status>({
    tryFn: async () => {
      const response = await fetch('https://api.mywebsite.com/comments', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({ comment }),
      });
      // ?? functional conditional
      return response.ok ? 'success' : 'error';
    },
    catchFn: async (error) => 'error',
  });

  // do something with commentStatus...
}

可讀性,模塊化,和單一職責

處理異常時遵循的兩個 try-catch 經驗法則:

  • try-catch 應盡可能靠近錯誤的源頭
  • 每個函數只使用一個 try-catch

他們將使你的代碼在短期和長期內更易于閱讀和維護。看看這里的 processJSONFile() ??,它遵守了規則 1。

第一個 try-catch 僅負責處理文件讀取錯誤,沒有其他功能。不會再向 try 添加任何邏輯,所以 catch 也永遠不會改變。

接下來的 try-catch 就在這里處理 JSON 解析。

function processJSONFile(filePath) {
  let contents;
  let jsonContents;

  // ? 第一個 try-catch 塊,用于處理文件讀取錯誤
  try {
    contents = fs.readFileSync(filePath, 'utf8');
  } catch (error) {
    // 在這里記錄錯誤
    contents = null;
  }

  // ? 第二個 try-catch 塊,用于處理 JSON 解析錯誤
  try {
    jsonContents = JSON.parse(contents);
  } catch (error) {
    // 在這里記錄錯誤
    jsonContents = null;
  }

  return jsonContents;
}

但是 processJsonFile() 完全無視規則 2,同一個函數中的 try-catch 塊都在。

那么,我們通過將它們重構為各自的函數來解決這個問題:

function processJSONFile(filePath) {
  const contents = getFileContents(filePath);
  const jsonContents = parseJSON(contents);

  return jsonContents;
}

function getFileContents(filePath) {
  let contents;
  try {
    contents = fs.readFileSync(filePath, 'utf8');
  } catch (error) {
    contents = null;
  }
  return contents;
}

function parseJSON(content) {
  let json;
  try {
    json = JSON.parse(content);
  } catch (error) {
    json = null;
  }
  return json;
}

但是我們現在有 tryCatch() - 我們可以做得更好:

function processJSONFile(filePath) {
  return parseJSON(getFileContents(filePath));
}

const getFileContents = (filePath) =>
  tryCatch({
    tryFn: () => fs.readFileSync(filePath, 'utf8'),
    catchFn: () => null,
  });

const parseJSON = (content) =>
  tryCatch({
    tryFn: () => JSON.parse(content),
    catchFn: () => null,
  });

我們正在做的只不過是消除異常——這就是這些新功能的主要工作。

如果這種情況經常發生,為什么不創建一個“靜音器”版本,在成功時返回 try 函數的結果,或者在錯誤時什么也不返回?

function tryCatch<T>(fn: () => T) {
  try {
    return fn();
  } catch (error) {
    return null;
  }
}

將我們的代碼進一步縮短為這樣:

function processJSONFile(filePath) {
  return parseJSON(getFileContents(filePath));
}

const getFileContents = (filePath) => 
  tryCatch(() => fs.readFileSync(filePath, 'utf8'));

const parseJSON = (content) => 
  tryCatch(() => JSON.parse(content));

附注:在命名標識符時,我建議我們盡可能地使用名詞來表示變量,形容詞來表示函數,而對于高階函數……我們可以使用副詞!就像一個故事,代碼將更自然地閱讀,并可能更好地理解。

所以,我們可以使用 silently ,而不是 tryCatch :

const getFileContents = (filePath) => 
  silently(() => fs.readFileSync(filePath, 'utf8'));

const parseJSON = (content) => 
  silently(() => JSON.parse(content));

總結

當然, try-catch 本身就能完美運行。

我們并沒有丟棄它,而是將其轉化為更易維護和可預測的工具。 tryCatch() 甚至只是許多使用像 try-catch 這樣的命令式構造的聲明式友好函數之一

如果更喜歡直接使用 try-catch ,請記住使用 2 個 try-catch 的經驗法則,以提高您的代碼的模塊化和可讀性。

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2024-05-24 08:59:15

2025-01-16 12:00:00

try-catchfor循環

2024-11-04 08:20:00

try-catch編程

2025-04-29 08:05:00

JavaScript錯誤處理開發

2009-07-21 14:30:38

Scalatry-catch

2020-05-29 08:14:49

代碼Try-Catch程序員

2025-02-12 12:00:00

前端try-catchJavaScrip

2024-12-02 11:07:24

Java代碼機制

2020-10-14 12:10:22

Javatry-catch代碼

2024-05-07 07:58:47

C#程序類型

2017-11-02 15:26:10

JavaScriptasync錯誤

2022-01-25 12:14:39

面試try-catch代碼

2020-08-24 13:35:59

trycatchJava

2020-09-27 07:48:40

不用try catch

2024-11-13 01:00:18

asyncawait?編程

2023-05-16 15:32:45

JavaScriptWeb前端工程師

2023-11-13 17:01:26

C++編程

2025-08-07 06:05:00

try/catch前端JavaScrip

2009-12-02 19:56:33

PHP中try{}ca

2009-04-10 13:48:17

JavaScripteval全局代碼
點贊
收藏

51CTO技術棧公眾號

成人午夜在线播放| 不卡一区2区| 午夜视频在线观看一区| 久草一区二区| 成人毛片一区二区三区| 香港欧美日韩三级黄色一级电影网站| 91麻豆精品国产91久久久更新时间 | 视频一区亚洲| 99久久久国产精品无码网爆| 宅男噜噜噜66一区二区| 中文国产成人精品久久一| 一二三级黄色片| 神马久久午夜| 成人免费在线视频观看| 成人三级在线| 亚洲一级av毛片| 99精品视频免费观看| 日日噜噜噜夜夜爽亚洲精品 | 国产精品18| 亚洲成在人线免费| 日本一区二区三区视频在线观看| 97人人爽人人爽人人爽| 先锋影音久久| 久久久久久久999| 亚洲av成人精品一区二区三区| 成人在线免费电影网站| 五月天网站亚洲| 亚洲天堂av免费在线观看| 瑟瑟在线观看| 国产风韵犹存在线视精品| 国产成人免费av| 亚洲第一精品在线观看| 欧美人成在线| 狠狠色狠狠色综合婷婷tag| zzijzzij亚洲日本少妇熟睡| 国产日韩综合一区二区性色av| 91蜜桃视频在线观看| 亚洲国产老妈| 中文字幕亚洲第一| 一级片手机在线观看| 久久精品国产亚洲5555| 日韩欧美中文字幕一区| 中文字幕第88页| 日韩制服一区| 日本道在线观看一区二区| 日本日本19xxxⅹhd乱影响| 精品一性一色一乱农村| 亚洲精品国产高清久久伦理二区| 影音先锋欧美资源| 欧美三级电影一区二区三区| 中文字幕巨乱亚洲| 天堂一区二区三区| aaa日本高清在线播放免费观看| 久久久久久久久久久电影| 蜜桃传媒视频麻豆第一区免费观看| 老熟妇高潮一区二区高清视频| 国产精品911| 成人动漫视频在线观看免费| 精品国产乱码久久久久久蜜臀网站| 精品亚洲国产成人av制服丝袜| 国产区精品视频| 97超碰资源站| 国产精品99久久久久久久vr| 亚洲最大福利网站| 亚洲av无码专区在线| 91国产精品一区| 999国产精品999久久久久久| 日韩一区二区久久久| 手机av在线看| 国产尤物精品| 97福利一区二区| 天堂网av手机版| 久久综合影音| 国产日产亚洲精品| 国产日韩一级片| 国产成人av自拍| 国内成+人亚洲| 欧美孕妇孕交| 国产精品理伦片| 异国色恋浪漫潭| av资源在线看片| 日韩欧美福利视频| 九九九在线观看视频| 免费日韩成人| 欧美tk丨vk视频| 欧美大片免费播放器| 精品久久成人| 久久国产精彩视频| 全部毛片永久免费看| 视频一区欧美日韩| 成人在线免费观看视视频| 国产三级午夜理伦三级| 成人午夜看片网址| 日韩高清专区| 三级资源在线| 91福利在线导航| 亚洲一级片免费观看| 久久视频在线观看| 国产午夜精品一区理论片飘花| 99久久久免费精品| 亚洲综合99| 亚洲一区二区三区sesese| 五月婷在线视频| 国产精品夫妻自拍| 2022亚洲天堂| 日韩在线观看中文字幕| 亚洲美女久久久| 欧美爱爱小视频| 日本一不卡视频| 国产精品久久久久久久久婷婷| 国产h在线观看| 午夜私人影院久久久久| 亚洲精品综合在线观看| 色爱综合av| 欧美乱妇高清无乱码| 日韩精品在线一区二区三区| 成人激情小说网站| dy888午夜| 欧美三级网址| 亚洲成色777777在线观看影院| 亚洲精品自拍视频在线观看| 久久av最新网址| 91香蕉视频在线下载| 成年人视频网站在线| 精品久久久精品| 无码国产精品一区二区高潮| 成人亚洲一区二区| 奇米4444一区二区三区| 韩国av电影在线观看| 亚洲免费观看高清完整版在线观看熊| 毛葺葺老太做受视频| 欧美日韩导航| 亚洲91精品在线观看| 亚洲大尺度网站| 亚洲精品成人天堂一二三| 免费看污污网站| 欧美裸体在线版观看完整版| 韩日精品中文字幕| 亚洲精品97久久中文字幕| 日韩美女久久久| 天天干天天玩天天操| 精品视频免费| 国产第一区电影| 久香视频在线观看| 日韩欧美在线观看视频| 91视频啊啊啊| 亚洲一区二区三区高清| 精品久久久久亚洲| 理论片午夜视频在线观看| 亚洲成av人片在线观看香蕉| 亚洲国产精品午夜在线观看| 成人午夜精品一区二区三区| 九九爱精品视频| 日本中文字幕在线一区| 久久久久久香蕉网| 四虎永久在线精品免费网址| 天天综合色天天综合色h| 午夜剧场免费看| 亚洲视频大全| 欧美综合77777色婷婷| 久久91导航| 中文字幕最新精品| 97av免费视频| 亚洲国产精品尤物yw在线观看| 污污免费在线观看| 国产精品日韩久久久| 欧美一级二级三级| 久久精品 人人爱| 久久天堂av综合合色| www.黄色片| 天天亚洲美女在线视频| 波多野结衣片子| 久久精品国产成人一区二区三区 | 久久久久国产精品| 91入口在线观看| 在线视频cao| 在线电影欧美日韩一区二区私密| 亚洲一区在线观| 亚洲午夜视频在线| 亚洲av无码一区二区三区人| 久久精品99国产精品日本| 成人在线观看毛片| 少妇一区二区三区| 国产日韩中文字幕| 国产欧洲在线| 中文字幕亚洲一区| 精品人妻一区二区三区蜜桃| 精品欧美一区二区三区| 99久久久无码国产精品不卡| 福利电影一区二区三区| 日韩av黄色网址| 久久久久亚洲| 精品国产一区二区三区免费| 亚洲天堂1区| 欧美国产日本高清在线| 黄色片免费在线| 日韩一区二区在线观看| 四虎成人在线观看| 亚洲乱码国产乱码精品精的特点| 特级西西人体wwwww| 久久成人免费电影| 日本国产在线播放| 亚洲精品一二三区区别| 欧美激情第一页在线观看| 精品国产一区二| 日韩美女视频中文字幕| 在线观看的网站你懂的| 一区二区欧美日韩视频| 神马午夜在线观看| 91麻豆精品国产91久久久使用方法| 波多野结衣国产| 一区二区三区成人在线视频| 国产一区二区三区精品在线| 不卡影院免费观看| 久草福利在线观看| 精品在线免费视频| 十八禁视频网站在线观看| 欧美日韩免费| 欧美 另类 交| 青青草原综合久久大伊人精品| 精品视频一区二区| 91蜜桃臀久久一区二区| 成人午夜黄色影院| 成人h在线观看| 青草青草久热精品视频在线观看| 免费毛片在线看片免费丝瓜视频 | 美女的胸无遮挡在线观看| 久久久www成人免费精品张筱雨| 蜜桃成人在线视频| 亚洲精品狠狠操| 免费看黄色一级视频| 欧美一区二区三区色| 亚洲一区二区人妻| 欧美视频日韩视频在线观看| 久久久精品视频网站| 精品成人在线视频| 日本熟妇成熟毛茸茸| 一区二区久久久久| 欧美激情一区二区视频| 亚洲激情图片一区| 少妇影院在线观看| 一区二区三区在线视频免费 | 成人av在线天堂| 国产精品诱惑| 国产精品在线看| 国产一区精品福利| 国产精品一区二区三区成人| 欧美黄色a视频| 国产视频福利一区| 亚洲一区二区av| 成人观看高清在线观看免费| 宅男噜噜噜66国产精品免费| 国产在线观看精品一区二区三区| 婷婷久久综合九色综合99蜜桃| 国产热re99久久6国产精品| 九七电影院97理论片久久tvb| 国产欧美日韩91| 国产精品成人**免费视频| 91精品视频一区| 一区二区中文字幕在线观看| 国产不卡一区二区在线观看| 国产精品久久久久久久久久白浆| 国模精品一区二区三区| 欧美日本成人| 亚洲二区三区四区| 亚洲精品成人影院| 91午夜在线观看| 久久久www| 国产精品久久久毛片| 国产乱子伦视频一区二区三区 | 大肉大捧一进一出好爽视频| 亚洲欧美视频一区二区三区| 日韩av资源在线| 老司机免费视频一区二区三区| 美女被艹视频网站| 99久久精品国产观看| 国产精品久久久久久久av| 中文字幕综合网| 麻豆一区二区三区精品视频| 欧美日韩在线看| 一级片视频网站| 欧美变态凌虐bdsm| 蜜桃视频在线播放| 操日韩av在线电影| 深夜福利视频一区二区| 成人精品在线视频| 卡通动漫国产精品| 夜夜爽www精品| 极品中文字幕一区| 日韩av手机版| 懂色av噜噜一区二区三区av| 日韩丰满少妇无码内射| 亚洲精品乱码久久久久久| 五月天婷婷激情| 91精品国产欧美日韩| 欧美孕妇孕交| 色综合久久88色综合天天看泰| av日韩亚洲| 91大片在线观看| 国产一卡不卡| 国产不卡一区二区视频| 美女视频免费一区| 美女露出粉嫩尿囗让男人桶| 久久久91精品国产一区二区精品 | 色综合中文综合网| 91丨porny丨在线中文 | 成人免费在线一区二区三区| 国产在线日韩精品| 国产一区二区三区小说| 麻豆一区二区三| 亚洲精品视频大全| 亚洲综合精品自拍| 中文字幕人妻色偷偷久久| 日韩成人久久久| 日本欧美电影在线观看| 国产免费成人av| 伊人久久综合影院| 亚洲中文字幕无码av永久| 国内精品国产三级国产a久久 | 一本色道久久综合亚洲精品酒店| 欧美日韩中文字幕在线播放| 美腿丝袜亚洲综合| 最近中文字幕免费视频| 午夜婷婷国产麻豆精品| 亚洲一区二区免费| 全球av集中精品导航福利| 一二三在线视频| 六月婷婷色综合| 鲁丝一区二区三区| 欧美性xxxxxxx| 日日躁夜夜躁白天躁晚上躁91| 欧美xxxx14xxxxx性爽| 亚洲图片小说区| 亚洲精品无人区| 日韩高清中文字幕一区| 国产乱了高清露脸对白| 亚洲成av人在线观看| 亚洲AV无码精品国产| 久久天天躁狠狠躁夜夜爽蜜月| 免费视频成人| 亚洲午夜精品一区二区三区| 日韩成人精品在线观看| 免费看黄色的视频| 欧美性生交xxxxxdddd| 日韩私人影院| 日本精品视频在线| 亚洲婷婷影院| 欧美丰满熟妇xxxxx| 久久久久久久久一| 美女黄页在线观看| 有码中文亚洲精品| 91精品美女| 亚洲看片网站| 九一九一国产精品| 国产97免费视频| 欧美一卡二卡三卡四卡| 在线观看三级视频| 国产精品一区二| 国产一区二区三区久久| 久久人人爽人人爽人人片| 欧美色道久久88综合亚洲精品| 欧洲亚洲在线| 国产免费一区二区三区在线能观看 | 国产欧美一区二区三区国产幕精品| 日本黄色录像片| 色综合久久天天| 幼a在线观看| 91黄在线观看| 亚洲欧洲日本一区二区三区| 野外性满足hd| 欧美丝袜丝nylons| 国产在线高清视频| 国产98在线|日韩| 亚洲欧美清纯在线制服| 在线观看免费小视频| 欧美一区二区网站| www中文字幕在线观看| 奇米视频888战线精品播放| 免费成人在线视频观看| 538任你躁在线精品视频网站| 精品卡一卡二卡三卡四在线| 中文字幕色婷婷在线视频| 亚洲二区自拍| 成人综合激情网| 国产精品久久久久久久久夜色| 久久国内精品一国内精品| 久久久久影视| 在线观看岛国av| 亚洲国产精品尤物yw在线观看| 免费福利在线观看| 91国产丝袜在线放| 美女日韩在线中文字幕| 国产第一页浮力| 国产视频久久久| 国产一区二区| 日韩av在线综合| 一个色在线综合| 番号集在线观看| 成人午夜电影在线播放| 日本美女一区二区|