ééãã¯è¯ãã§ãã æ¬æžã®èè
ã§ãã翻蚳è
ã¯ããã®ã¢ã€ãã¢ã誰ããç¥ã£ãŠãããšç¢ºä¿¡ããŠãããšèªã£ãŠããŸãã äžèŠããšã©ãŒã¯æãããã§ãã äœããã®æå€±ã䌎ãå ŽåããããŸãã å
¬ã®å Žã§ç¯ããééãã¯ããããç¯ããäººã®æš©åšãå·ã€ããŸãã ããããééããç¯ããšãç§ãã¡ã¯ãããããåŠã³ãŸããã€ãŸããæ¬¡ã«èª€ã£ãŠæ¯ãèã£ãç¶æ³ã«æ¬¡åå
¥ã£ããšãã«ãå¿
èŠã«å¿ããŠãã¹ãŠãè¡ããŸãã

äžèšã§ã¯ã人ã
ãæ¥åžžçæŽ»ã§ç¯ãéã¡ã«ã€ããŠè©±ããŸããã ããã°ã©ãã³ã°ã®ãšã©ãŒã¯å¥ã®ãã®ã§ãã ãšã©ãŒã¡ãã»ãŒãžã¯ãã³ãŒãã®æ¹åã«åœ¹ç«ã¡ãŸãããããžã§ã¯ãã®ãŠãŒã¶ãŒã«äœãåé¡ãçºçããããšãéç¥ãããšã©ãŒãçºçããªãããã«åäœããŠãŒã¶ãŒã«äŒããããšãã§ããŸãã
ãã®JavaScriptãšã©ãŒåŠçè³æã¯ã3ã€ã®éšåã«åãããŠããŸãã æåã«ãJavaScriptã®ãšã©ãŒåŠçã·ã¹ãã ã®æŠèŠã説æãããšã©ãŒãªããžã§ã¯ãã«ã€ããŠèª¬æããŸãã ãã®åŸããµãŒããŒã³ãŒãã§çºçãããšã©ãŒïŒç¹ã«Node.js + Express.jsãã³ãã«ã䜿çšããå ŽåïŒã§äœããã¹ãããšãã質åã«å¯Ÿããçããæ¢ããŸãã æ¬¡ã«ãReact.jsã§ã®ãšã©ãŒåŠçã«ã€ããŠèª¬æããŸãã ããã§æ€èšããããã¬ãŒã ã¯ãŒã¯ã¯ãéåžžã«äººæ°ãããããéžæãããŸãã ãã ããããã§èª¬æãããšã©ãŒã®åŠçã®ååã¯æ®éçã§ãããããExpressãšReactã䜿çšããªããŠããåŠãã ããšãäœæ¥ããŒã«ã«ç°¡åã«é©çšã§ããŸãã
ãã®è³æã§äœ¿çšãããŠãããã¢ãããžã§ã¯ãã®ã³ãŒãã¯ã
ãã®ãªããžããªã«ãããŸãã
1. JavaScriptã®ãšã©ãŒãšããããæ±ãæ®éçãªæ¹æ³
ã³ãŒãã«åé¡ãçºçããå Žåã¯ãæ¬¡ã®æ§æã䜿çšã§ããŸãã
throw new Error('something went wrong')
ãã®ã³ãã³ãã®å®è¡äžã«ããã®ãªããžã§ã¯ãã§
Errorãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããäŸå€ãçæãããŸãïŒãŸãã¯ããã¹ããŒããšåŒã°ããŸãïŒã
throwã¹ããŒãã¡ã³ãã¯ãä»»æã®åŒãå«ãäŸå€ãã¹ããŒã§ããŸãã ãã®å Žåããšã©ãŒãåŠçããããã®å¯Ÿçãè¬ããããŠããªãå Žåãã¹ã¯ãªããã®å®è¡ã¯åæ¢ããŸãã
éåžžãåå¿è
ã®JSããã°ã©ããŒã¯
throw
ã¹ããŒãã¡ã³ãã䜿çšããŸããã éåžžãèšèªã©ã³ã¿ã€ã ãŸãã¯ãµãŒãããŒãã£ã©ã€ãã©ãªã«ãã£ãŠã¹ããŒãããäŸå€ãçºçããŸãã ãããçºçãããšã
ReferenceError: fs is not defined
ãããªãã®ãã³ã³ãœãŒã«ã«å
¥ã
ReferenceError: fs is not defined
ãããã°ã©ã ã®å®è¡ã¯åæ¢ããŸãã
âãªããžã§ã¯ããšã©ãŒ
Error
ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯ã䜿çšã§ããããã€ãã®ããããã£ããããŸãã ç§ãã¡ãèå³ãæã€æåã®ããããã£ã¯
message
ã§ãã ããã¯ãåŒæ°ãšããŠãšã©ãŒã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããšãã§ããè¡ãååŸããå Žæã§ãã ããšãã°ã次ã®äŸã¯ã
Error
ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã®äœæãšã
message
ããããã£ã«ã¢ã¯ã»ã¹ããŠãã¶ã€ããŒãæž¡ããæååã®ã³ã³ãœãŒã«ãžã®åºåã瀺ããŠããŸãã
const myError = new Error('please improve your code') console.log(myError.message)
éåžžã«éèŠãªãªããžã§ã¯ãã®2çªç®ã®ããããã£ã¯ããšã©ãŒã¹ã¿ãã¯ã®ãã¬ãŒã¹ã§ãã ããã¯
stack
ããããã£ã§ãã ããã«ç®ãåãããšãã³ãŒã«ã¹ã¿ãã¯ïŒãšã©ãŒå±¥æŽïŒã衚瀺ã§ããŸããããã¯ãããã°ã©ã ã®èª€åäœãåŒãèµ·ãããäžé£ã®æäœã瀺ããŠããŸãã ç¹ã«ãããã«ãããã©ã®ãã¡ã€ã«ã«äžè¯ã³ãŒããå«ãŸããŠããããçè§£ãããšã©ãŒã«ã€ãªãã£ã颿°åŒã³åºãã®ã·ãŒã±ã³ã¹ã確èªã§ããŸãã
stack
ããããã£ã«ã¢ã¯ã»ã¹ããããšã§è¡šç€ºã§ãããã®ã®äŸã次ã«ç€ºããŸãã
Error: please improve your code at Object.<anonymous> (/Users/gisderdube/Documents/_projects/hacking.nosync/error-handling/src/general.js:1:79) at Module._compile (internal/modules/cjs/loader.js:689:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10) at Module.load (internal/modules/cjs/loader.js:599:32) at tryModuleLoad (internal/modules/cjs/loader.js:538:12) at Function.Module._load (internal/modules/cjs/loader.js:530:3) at Function.Module.runMain (internal/modules/cjs/loader.js:742:12) at startup (internal/bootstrap/node.js:266:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:596:3)
ããã§ãäžéšã«ã¯ãšã©ãŒã¡ãã»ãŒãžãããããã®åŸã«å®è¡ããšã©ãŒã®åå ãšãªã£ãã³ãŒãã®ã»ã¯ã·ã§ã³ã瀺ããããã®å€±æããã»ã¯ã·ã§ã³ãåŒã³åºãããå Žæã説æãããŠããŸãã ããã¯ããšã©ãŒã³ãŒããã©ã°ã¡ã³ãã«é¢ããŠãæãé ãããŸã§ç¶ããŸãã
âçæãšãšã©ãŒåŠç
Error
ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããã€ãŸãã
new Error()
ãšãã圢åŒã®ã³ãã³ããå®è¡ããŠããç¹å¥ãªçµæã¯çããŸããã ãšã©ãŒãçæãã
throw
ã¹ããŒãã¡ã³ããé©çšãããšãè峿·±ãããšãèµ·ããå§ããŸãã æ¢ã«è¿°ã¹ãããã«ããã®ãããªãšã©ãŒãåŠçãããªãå Žåãã¹ã¯ãªããã®å®è¡ã¯åæ¢ããŸãã åæã«ã
throw
æŒç®åãããã°ã©ããŒã«ãã£ãŠäœ¿çšããããã©ãããç¹å®ã®ã©ã€ãã©ãªãŒãŸãã¯èšèªã©ã³ã¿ã€ã ïŒãã©ãŠã¶ãŒãŸãã¯Node.jsïŒã§ãšã©ãŒãçºçãããã©ããã«éãã¯ãããŸããã ããŸããŸãªãšã©ãŒåŠçã·ããªãªã«ã€ããŠè©±ããŸãããã
â建èšããã...ãã£ãã
try...catch
ã¯ããã°ãã°å¿ãããããšã©ãŒãåŠçããæãç°¡åãªæ¹æ³ã§ãã ãã ãã仿¥ã§ã¯ã
async/await
æ§é ã®ãšã©ãŒãåŠçããããã«äœ¿çšã§ããããã以åãããã¯ããã«éäžçã«äœ¿çšãã
async/await
ãŸãã
ãã®ãããã¯ã¯ãåæã³ãŒãã§çºçãããšã©ãŒãåŠçããããã«äœ¿çšã§ããŸãã äŸãèããŠã¿ãŸãããã
const a = 5 try { console.log(b)
ãã®äŸã§ã倱æãã
console.log(b)
ã³ãã³ãã
try...catch
ã§å²ãŸãªãã£ãå Žåãã¹ã¯ãªããã¯åæ¢ããŸãã
âæåŸã«ãããã¯
ãšã©ãŒãçºçãããã©ããã«é¢ä¿ãªããäžéšã®ã³ãŒããå®è¡ããå¿
èŠãããå ŽåããããŸãã ãããè¡ãã«ã¯ã
try...catch
ã³ã³ã¹ãã©ã¯ãã§3çªç®ã®ãªãã·ã§ã³ã®
finally
ãããã¯ã䜿çšã§ããŸãã å€ãã®å Žåããã®äœ¿çšã¯
try...catch
çŽåŸã«æ¥ãã³ãŒããšåç
try...catch
ããç¶æ³ã«ãã£ãŠã¯äŸ¿å©ã«ãªãå ŽåããããŸãã 以äžã«ãã®äœ¿çšäŸã瀺ããŸãã
const a = 5 try { console.log(b)
éåæã¡ã«ããºã -ã³ãŒã«ããã¯
JavaScriptã§ããã°ã©ãã³ã°ãããšãã¯ãéåæã§å®è¡ãããã³ãŒãã®ã»ã¯ã·ã§ã³ã«åžžã«æ³šæãæãå¿
èŠããããŸãã éåæé¢æ°ãããããã®äžã«ãšã©ãŒãçºçããå Žåãã¹ã¯ãªããã¯åŒãç¶ãå®è¡ãããŸãã JSã®éåæã¡ã«ããºã ãã³ãŒã«ããã¯ã䜿çšããŠå®è£
ãããå ŽåïŒããã¯ãå§ãããŸããïŒã察å¿ããã³ãŒã«ããã¯ïŒã³ãŒã«ããã¯é¢æ°ïŒã¯éåžž2ã€ã®ãã©ã¡ãŒã¿ãŒãåãåããŸãã ããã¯ããšã©ãŒããã³
result
å«ãå¯èœæ§ã®ãã
err
ãã©ã¡ãŒã¿ãŒã®ãããªãã®ã§ãéåææäœã®çµæã䌎ããŸãã æ¬¡ã®ããã«ãªããŸãã
myAsyncFunc(someInput, (err, result) => { if(err) return console.error(err)
ã³ãŒã«ããã¯ã§ãšã©ãŒãçºçããå Žåããšã©ãŒãã©ã¡ãŒã¿ãšããŠè¡šç€ºãããŸãã ãã以å€ã®å Žåããã®ãã©ã¡ãŒã¿ãŒã¯å€
undefined
ãŸãã¯
null
ãååŸã
null
ã
err
äœã
err
ããããšã倿ããå Žåããã®äŸã§ã¯
return
ã³ãã³ãã䜿çšãã
if...else
ã
if...else
ã䜿çšããŠ
else
ãããã¯ã«ã³ãã³ããé
眮ããéåææäœã®çµæãåŠçãããããããã«åå¿ããããšãéèŠã§ãã ãšã©ãŒãçºçããå Žåãçµæãã€ãŸããã®å Žåã¯å€
undefined
æã€å¯èœæ§ã®ãã
result
ãã©ã¡ãŒã¿ãŒãåŠçããå¯èœæ§ãæé€ããããšã§ãã ãã®å€ãæäœãããšãããšãã°ããªããžã§ã¯ããå«ãŸããŠãããšæ³å®ãããå Žåãããèªäœããšã©ãŒãåŒãèµ·ããå¯èœæ§ããããŸãã ããã¯ã
result.data
ã³ã³ã¹ãã©ã¯ããªã©ã䜿çšããããšãããšãã«çºçããŸãã
synchronouséåæã¡ã«ããºã -çŽæ
JavaScriptã§éåææäœãå®è¡ããã«ã¯ãã³ãŒã«ããã¯ã§ã¯ãªããããã¹ã䜿çšããããšããå§ãããŸãã ããã§ã¯ãã³ãŒãã®å¯èªæ§ã®åäžã«å ããŠãããé«åºŠãªãšã©ãŒåŠçã¡ã«ããºã ããããŸãã ã€ãŸããpromiseã䜿çšããå Žåãã³ãŒã«ããã¯é¢æ°ã«åé¡ãããå¯èœæ§ã®ãããšã©ãŒãªããžã§ã¯ããæ°ã«ããå¿
èŠã¯ãããŸããã ãã®ç®çã®ããã«ãç¹å¥ãª
catch
ãããã¯ãæäŸãããŠããŸãã åã®promiseã§çºçãããã¹ãŠã®ãšã©ãŒããŸãã¯åã®
catch
åŸã®ã³ãŒãã§çºçãããã¹ãŠã®ãšã©ãŒãã€ã³ã¿ãŒã»ããã
catch
ã åŠçãã
catch
ãããã¯ãæããªããããã¹ã§ãšã©ãŒãçºçããå Žåãã¹ã¯ãªããã®å®è¡ã¯åæ¢ããŸãããããšã©ãŒã¡ãã»ãŒãžã¯ç¹ã«èªã¿ã«ããããšã«æ³šæããŠãã ããã
(node:7741) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: something went wrong (node:7741) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. */
ãã®çµæãPromiseã䜿çšããå Žåã¯ããã€ã§ã
catch
ã䜿çšããããšããå§ãã§ã
catch
ã äŸãèŠãŠã¿ãŸãããã
Promise.resolve(1) .then(res => { console.log(res)
synchronouséåæã¡ã«ããºã ãštry ... catch
JavaScriptã«
async/await
ã³ã³ã¹ãã©ã¯ãã衚瀺ãããåŸããšã©ãŒãåŠçããåŸæ¥ã®æ¹æ³ã«æ»ããŸããã ãã®ã¢ãããŒãã§ãšã©ãŒãåŠçããã®ã¯éåžžã«ç°¡åã§äŸ¿å©ã§ãã äŸãèããŠã¿ãŸãããã
;(async function() { try { await someFuncThatThrowsAnError() } catch (err) { console.error(err)
ãã®ã¢ãããŒãã§ã¯ãéåæã³ãŒãã®ãšã©ãŒã¯åæã®å Žåãšåãæ¹æ³ã§åŠçãããŸãã ãã®çµæãå¿
èŠã«å¿ããŠã1ã€ã®
catch
ãããåºç¯å²ã®ãšã©ãŒãåŠçã§ããããã«ãªããŸããã
2.ãµãŒããŒã³ãŒãã§ã®ãšã©ãŒã®çæãšåŠç
ãšã©ãŒãåŠçããããã®ããŒã«ãçšæã§ããã®ã§ãå®éã®ç¶æ³ã§ãããã䜿çšããŠäœãã§ããããèŠãŠã¿ãŸãããã ãšã©ãŒãçæããŠæ£ããåŠçããããšã¯ããµãŒããŒåŽããã°ã©ãã³ã°ã®éèŠãªåŽé¢ã§ãã ãšã©ãŒãåŠçããã«ã¯ãããŸããŸãªã¢ãããŒãããããŸãã ããã§ã¯ãããã³ããšã³ããŸãã¯ãµãŒããŒAPIã䜿çšããã¡ã«ããºã ã«äŸ¿å©ã«æž¡ããã
Error
ãªããžã§ã¯ããšãšã©ãŒã³ãŒãã®ã€ã³ã¹ã¿ã³ã¹ã«ç¬èªã®ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããã¢ãããŒãã瀺ããŸãã ç¹å®ã®ãããžã§ã¯ãã®ããã¯ãšã³ããã©ã®ããã«æ§æãããŠãããã¯ãå®éã«ã¯åé¡ã§ã¯ãããŸãããã©ã®ã¢ãããŒãã§ãããšã©ãŒã®åŠçã«é¢ããŠåãã¢ã€ãã¢ã䜿çšã§ããããã§ãã
ã«ãŒãã£ã³ã°ãæ
åœãããµãŒããŒãã¬ãŒã ã¯ãŒã¯ãšããŠãExpress.jsã䜿çšããŸãã 广çãªãšã©ãŒåŠçã·ã¹ãã ãç·šæããããã«å¿
èŠãªæ§é ã«ã€ããŠèããŠã¿ãŸãããã å¿
èŠãªãã®ã¯æ¬¡ã®ãšããã§ãã
- æ®éçãªãšã©ãŒåŠçã¯ããšã©ãŒãåŠçããã®ã«é©ããåºæ¬çãªã¡ã«ããºã ã§ãããã®éã
Something went wrong, please try again or contact us
ãªãã£ããšããã¡ãã»ãŒãžSomething went wrong, please try again or contact us
ãã®ã·ã¹ãã ã¯ç¹ã«ã€ã³ããªãžã§ã³ãã§ã¯ãããŸããããå°ãªããšãäœããããŸããããªãã£ãããšããŠãŒã¶ãŒã«ç¥ãããããšãã§ããŸãã ãã®ãããªã¡ãã»ãŒãžã¯ããç¡éããŠã³ããŒãããŸãã¯ãã®ãããªãã®ãããã¯ããã«åªããŠããŸãã - ç¹å®ã®ãšã©ãŒã®åŠç-äžé©åãªã·ã¹ãã åäœã®åå ã«é¢ãã詳现æ
å ±ããŠãŒã¶ãŒã«éç¥ããåé¡ã®å¯ŸåŠæ¹æ³ã«é¢ããå
·äœçãªã¢ããã€ã¹ããŠãŒã¶ãŒã«æäŸã§ããã¡ã«ããºã ã ããšãã°ãããã¯ããŠãŒã¶ãŒããµãŒããŒã«éä¿¡ãããªã¯ãšã¹ãã«ããã€ãã®éèŠãªããŒã¿ããªãããšããŸãã¯ããŒã¿ããŒã¹ã«ç¹å®ã®ã¬ã³ãŒããæ¢ã«è¿œå ãããŠãããªã©ã«é¢é£ããå ŽåããããŸãã
errorãšã©ãŒãªããžã§ã¯ãã®ç¬èªã®ã³ã³ã¹ãã©ã¯ã¿ãŒã®éçº
ããã§ã¯ãæšæºã®
Error
ã¯ã©ã¹ã䜿çšããŠæ¡åŒµããŸãã JavaScriptã§ç¶æ¿ã¡ã«ããºã ã䜿çšããã®ã¯å±éºã§ããããã®å Žåããããã®ã¡ã«ããºã ã¯éåžžã«äŸ¿å©ã§ãã ãªãç¶æ¿ãå¿
èŠãªã®ã§ããïŒ å®éã®ãšãããã³ãŒãã䟿å©ã«ãããã°ããã«ã¯ããšã©ãŒã¹ã¿ãã¯ã®ãã¬ãŒã¹ã«é¢ããæ
å ±ãå¿
èŠã§ãã æšæºã®
Error
ã¯ã©ã¹ãæ¡åŒµãããšãäœåãªåŽåãªãã§ã¹ã¿ãã¯ããã¬ãŒã¹ã§ããŸãã ç¬èªã®ãšã©ãŒãªããžã§ã¯ãã«2ã€ã®ããããã£ã远å ããŸãã 1ã€ç®ã¯
code
ããããã£ã§ãããã¯
err.code
圢åŒã®æ§é ã䜿çšããŠã¢ã¯ã»ã¹ã§ããŸãã 2çªç®ã¯
status
ããããã£ã§ãã ããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãéšåã«éä¿¡ãããäºå®ã®HTTPã¹ããŒã¿ã¹ã³ãŒããèšé²ããŸãã
ããã¯ãã³ãŒããã¢ãžã¥ãŒã«ãšããŠèšèšãããŠãã
CustomError
ã¯ã©ã¹ã®å€èгã§ãã
class CustomError extends Error { constructor(code = 'GENERIC', status = 500, ...params) { super(...params) if (Error.captureStackTrace) { Error.captureStackTrace(this, CustomError) } this.code = code this.status = status } } module.exports = CustomError
âã«ãŒãã£ã³ã°
ãšã©ãŒãªããžã§ã¯ãã䜿çšããæºåãã§ããã®ã§ãã«ãŒãæ§é ãæ§æããå¿
èŠããããŸãã åè¿°ã®ããã«ããšã©ãŒåŠçã«å¯Ÿããçµ±äžãããã¢ãããŒããå®è£
ããå¿
èŠããããŸããããã«ããããã¹ãŠã®ã«ãŒãã®ãšã©ãŒãçããåŠçã§ããŸãã ããã©ã«ãã§ã¯ãExpress.jsãã¬ãŒã ã¯ãŒã¯ã¯ãã®ãããªã¹ããŒã ãå®å
šã«ã¯ãµããŒãããŠããŸããã å®éã«ã¯ããã¹ãŠã®ã«ãŒããã«ãã»ã«åãããŠããŸãã
ãã®åé¡ã«å¯ŸåŠããããã«ãç¬èªã®ã«ãŒããã³ãã©ãå®è£
ããéåžžã®é¢æ°ã®åœ¢åŒã§ã«ãŒãããžãã¯ãå®çŸ©ã§ããŸãã ãã®ã¢ãããŒãã®ãããã§ãã«ãŒã颿°ïŒãŸãã¯ä»ã®é¢æ°ïŒããšã©ãŒãã¹ããŒããå Žåãããã¯ã«ãŒããã³ãã©ãŒã«åé¡ãããã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãéšåã«æž¡ãããšãã§ããŸãã ãµãŒããŒã§ãšã©ãŒãçºçããå ŽåãJSON-APIãããã«äœ¿çšããããšæ³å®ããŠã次ã®åœ¢åŒã§ããã³ããšã³ãã«ãšã©ãŒã転éããäºå®ã§ãã
{ error: 'SOME_ERROR_CODE', description: 'Something bad happened. Please try again or contact support.' }
ãã®æ®µéã§äœãèµ·ãã£ãŠããã®ãçè§£ã§ããªãå Žåã¯ãå¿é
ããªãã§ãã ãããèªã¿ç¶ããè°è«ãããŠããããšã詊ããŠã¿ãŠãã ãããåŸã
ã«çè§£ããŠãããŸãã å®éãã³ã³ãã¥ãŒã¿ãŒãã¬ãŒãã³ã°ã«é¢ããŠã¯ãäžè¬çãªã¢ã€ãã¢ãæåã«è°è«ãããæ¬¡ã«è©³çްãžã®ç§»è¡ãå®è¡ããããšãã«ãããã§ã¯ããããããŠã³ãã¢ãããŒãã䜿çšãããŸãã
ãããã«ãŒããã³ãã©ã³ãŒãã®å€èгã§ãã
const express = require('express') const router = express.Router() const CustomError = require('../CustomError') router.use(async (req, res) => { try { const route = require(`.${req.path}`)[req.method] try { const result = route(req)
ã³ãŒãå
ã®ã³ã¡ã³ãããããéåžžã«ãã説æããŠãããšä¿¡ããŠããŸãã ãããã®ã³ãŒããèªãããšã¯ããã®åŸã®ã³ãŒãã®èª¬æããã䟿å©ã§ããããšãé¡ã£ãŠããŸãã
ã«ãŒããã¡ã€ã«ãèŠãŠã¿ãŸãããã
const CustomError = require('../CustomError') const GET = req => {
ãããã®äŸã§ã¯ãã¯ãšãªèªäœã¯äœãå®è¡ãããŸããã ãšã©ãŒã®çºçã«ã€ããŠãããŸããŸãªã·ããªãªãåçŽã«èæ
®ããŸãã ãããã£ãŠãããšãã°ã
GET /city
ãªã¯ãšã¹ãã¯
const GET = req =>...
颿°
const GET = req =>...
ã«åé¡ããã
POST /city
ãªã¯ãšã¹ãã¯
const POST = req =>...
颿°
const POST = req =>...
åé¡ãããŸãã ãã®ã¹ããŒã ã¯ãã¯ãšãªãã©ã¡ãŒã¿ã䜿çšããå Žåã«ãæ©èœããŸãã ããšãã°ããã©ãŒã
GET /city?startsWith=R
äžè¬çã«ããšã©ãŒãåŠçããéãããã³ããšã³ãã¯ãå詊è¡ãŸãã¯ãµãŒããŒææè
ãžã®é£çµ¡ã®ç³ãåºã®ã¿ãå«ãäžè¬ãšã©ãŒããŸãã¯åé¡ã«é¢ãã詳现æ
å ±ãå«ã
CustomError
ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠçæããããšã©ãŒã®ãããããååŸããããšãå®èšŒãããŠããŸãã
äžè¬çãªãšã©ãŒããŒã¿ã¯ã次ã®åœ¢åŒã§ã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãéšåã«éãããŸãã
{ error: 'GENERIC', description: 'Something went wrong. Please try again or contact support.' }
CustomError
ã³ã³ã¹ãã©ã¯ã¿ãŒã¯æ¬¡ã®ããã«äœ¿çšãããŸãã
throw new CustomError('MY_CODE', 400, 'Error description')
ããã«ãããæ¬¡ã®JSONã³ãŒããããã³ããšã³ãã«æž¡ãããŸãã
{ error: 'MY_CODE', description: 'Error description' }
ã¢ããªã±ãŒã·ã§ã³ã®ãµãŒããŒéšåã§åŸ¹åºçã«äœæ¥ããã®ã§ã圹ã«ç«ããªããšã©ãŒãã°ã¯ã¯ã©ã€ã¢ã³ãéšåã«åé¡ãããªããªããŸããã 代ããã«ãã¯ã©ã€ã¢ã³ãã¯äœãããŸããããªãã£ããã«é¢ããæçšãªæ
å ±ãåãåããŸãã
ããã«ããã³ãŒããå«ããªããžããªã
ããã«ããããšãå¿ããªãã§ãã ããã ããŠã³ããŒãããŠè©ŠããŠã¿ãŠãå¿
èŠã«å¿ããŠãããžã§ã¯ãã®ããŒãºã«åãããŠèª¿æŽããŠãã ããã
3.ã¯ã©ã€ã¢ã³ãã§ãšã©ãŒãåŠçãã
次ã«ãããã³ããšã³ãã«é¢ãããšã©ãŒåŠçã·ã¹ãã ã®3çªç®ã®éšåã«ã€ããŠèª¬æããŸãã ããã§ã¯ããŸãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãéšåã§çºçãããšã©ãŒãåŠçããå¿
èŠããããæ¬¡ã«ãµãŒããŒã§çºçãããšã©ãŒã«ã€ããŠãŠãŒã¶ãŒã«éç¥ããå¿
èŠããããŸãã ãŸãããµãŒããŒãšã©ãŒæ
å ±ã衚瀺ããŸãã æ¢ã«è¿°ã¹ãããã«ããã®äŸã§ã¯Reactã©ã€ãã©ãªãŒã䜿çšãããŸãã
errorãšã©ãŒç¶æ
ãã¢ããªã±ãŒã·ã§ã³ç¶æ
ã§ä¿åãã
ä»ã®ããŒã¿ãšåæ§ã«ããšã©ãŒãšãšã©ãŒã¡ãã»ãŒãžã¯å€æŽãããå¯èœæ§ããããããã³ã³ããŒãã³ãã®ç¶æ
ã«ããããšã¯çã«ããªã£ãŠããŸãã ã³ã³ããŒãã³ããããŠã³ãããããšããšã©ãŒããŒã¿ããªã»ãããããããããŠãŒã¶ãŒãæåã«ããŒãžã衚瀺ãããšãã«ãšã©ãŒã¡ãã»ãŒãžã¯è¡šç€ºãããŸããã
次ã«å¯ŸåŠããã®ã¯ãåãã¿ã€ãã®ãšã©ãŒãåãã¹ã¿ã€ã«ã§è¡šç€ºããå¿
èŠããããšããããšã§ãã ãµãŒããŒãšåæ§ã«ãããã§ã¯3çš®é¡ã®ãšã©ãŒãåºå¥ã§ããŸãã
- ã°ããŒãã«ãšã©ãŒ-ãã®ã«ããŽãªã«ã¯ããµãŒããŒããçºçããäžè¬çãªæ§è³ªã®ãšã©ãŒã¡ãã»ãŒãžããŸãã¯ä»ã®åæ§ã®ç¶æ³ã§ãŠãŒã¶ãŒãã·ã¹ãã ã«ãã°ã€ã³ããŠããªãå Žåã«çºçãããšã©ãŒãªã©ãå«ãŸããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®ãµãŒããŒåŽã§çæãããç¹å®ã®ãšã©ãŒ-ããã«ã¯ããµãŒããŒããå ±åããããšã©ãŒãå«ãŸããŸãã ããšãã°ããŠãŒã¶ãŒããã°ã€ã³ããŠãŠãŒã¶ãŒåãšãã¹ã¯ãŒãããµãŒããŒã«éä¿¡ããããšãããšãã«ããã¹ã¯ãŒããééã£ãŠããããšããµãŒããŒãéç¥ããå Žåãåæ§ã®ãšã©ãŒãçºçããŸãã ãã®ãããªããšã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãéšåã§ã¯ãã§ãã¯ãããªãããããã®ãããªãšã©ãŒã«é¢ããã¡ãã»ãŒãžã¯ãµãŒããŒããéä¿¡ãããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãéšåã«ãã£ãŠçæãããç¹å®ã®ãšã©ãŒã ãã®ãããªãšã©ãŒã®äŸã¯ã察å¿ãããã£ãŒã«ãã«å
¥åãããç¡å¹ãªã¡ãŒã«ã¢ãã¬ã¹ã«é¢ããã¡ãã»ãŒãžã§ãã
2çªç®ãš3çªç®ã®ã¿ã€ãã®ãšã©ãŒã¯éåžžã«ãã䌌ãŠããã1ã¬ãã«ã®ã³ã³ããŒãã³ãã®ç¶æ
ã¹ãã¢ã䜿çšããŠæäœã§ããŸãã 圌ãã®äž»ãªéãã¯ãããããç°ãªããœãŒã¹ããæ¥ãŠããããšã§ãã 以äžã§ã¯ãã³ãŒããåæããŠããããã®äœ¿çšãæ€èšããŸãã
Reactã§ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã管çããããã«çµã¿èŸŒã¿ã·ã¹ãã ã䜿çšããŸãããå¿
èŠã«å¿ããŠãMobXãReduxãªã©ã®ç¶æ
ã管çããããã®ç¹å¥ãªãœãªã¥ãŒã·ã§ã³ã䜿çšããããšãã§ããŸãã
âã°ããŒãã«ãšã©ãŒ
éåžžããã®ãããªãšã©ãŒã¡ãã»ãŒãžã¯ãã¹ããŒã¿ã¹ãšãšãã«æäžäœã®ã³ã³ããŒãã³ãã«ä¿åãããŸãã ãããã¯ãéçãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ã«è¡šç€ºãããŸãã ããã¯ãç»é¢äžéšã®èµ€ãããã¯ã¹ãã¢ãŒãã«ãŠã£ã³ããŠããŸãã¯ãã®ä»ã®ãã®ã§ãã å®è£
ã¯ç¹å®ã®ãããžã§ã¯ãã«äŸåããŸãã ããããšã©ãŒã¡ãã»ãŒãžã®è¡šç€ºã§ãã
ã°ããŒãã«ãšã©ãŒã¡ãã»ãŒãžããã§ã
Application.js
ãã¡ã€ã«ã«ä¿åãããŠããã³ãŒããèŠãŠãã ããã
import React, { Component } from 'react' import GlobalError from './GlobalError' class Application extends Component { constructor(props) { super(props) this.state = { error: '', } this._resetError = this._resetError.bind(this) this._setError = this._setError.bind(this) } render() { return ( <div className="container"> <GlobalError error={this.state.error} resetError={this._resetError} /> <h1>Handling Errors</h1> </div> ) } _resetError() { this.setState({ error: '' }) } _setError(newError) { this.setState({ error: newError }) } } export default Application
ã芧ã®ããã«ããã®ç¶æ
ã§ã¯
Application.js
ã«ãšã©ãŒããŒã¿ãä¿åããå ŽæããããŸãã , .
GlobalError
,
x
, .
GlobalError
(
GlobalError.js
).
import React, { Component } from 'react' class GlobalError extends Component { render() { if (!this.props.error) return null return ( <div style={{ position: 'fixed', top: 0, left: '50%', transform: 'translateX(-50%)', padding: 10, backgroundColor: '#ffcccc', boxShadow: '0 3px 25px -10px rgba(0,0,0,0.5)', display: 'flex', alignItems: 'center', }} > {this.props.error} <i className="material-icons" style={{ cursor: 'pointer' }} onClick={this.props.resetError} > close </font></i> </div> ) } } export default GlobalError
if (!this.props.error) return null
. , . . , , , . , ,
x
, - , .
, ,
_setError
Application.js
. , , , , (
error: 'GENERIC'
). (
GenericErrorReq.js
).
import React, { Component } from 'react' import axios from 'axios' class GenericErrorReq extends Component { constructor(props) { super(props) this._callBackend = this._callBackend.bind(this) } render() { return ( <div> <button onClick={this._callBackend}>Click me to call the backend</button> </div> ) } _callBackend() { axios .post('/api/city') .then(result => {
, . , , . . -, , -, UX-, , â .
â ,
, , , .
, . . .
SpecificErrorReq.js
.
import React, { Component } from 'react' import axios from 'axios' import InlineError from './InlineError' class SpecificErrorRequest extends Component { constructor(props) { super(props) this.state = { error: '', } this._callBackend = this._callBackend.bind(this) } render() { return ( <div> <button onClick={this._callBackend}>Delete your city</button> <InlineError error={this.state.error} /> </div> ) } _callBackend() { this.setState({ error: '', }) axios .delete('/api/city') .then(result => { // - , }) .catch(err => { if (err.response.data.error === 'GENERIC') { this.props.setError(err.response.data.description) } else { this.setState({ error: err.response.data.description, }) } }) } } export default SpecificErrorRequest
, , ,
x
. , , . , , â , , , . , , . , , , â .
â,
, , , . , , - . .
,SpecificErrorFrontend.js
, .
import React, { Component } from 'react' import axios from 'axios' import InlineError from './InlineError' class SpecificErrorRequest extends Component { constructor(props) { super(props) this.state = { error: '', city: '', } this._callBackend = this._callBackend.bind(this) this._changeCity = this._changeCity.bind(this) } render() { return ( <div> <input type="text" value={this.state.city} style={{ marginRight: 15 }} onChange={this._changeCity} /> <button onClick={this._callBackend}>Delete your city</button> <InlineError error={this.state.error} /> </div> ) } _changeCity(e) { this.setState({ error: '', city: e.target.value, }) } _validate() { if (!this.state.city.length) throw new Error('Please provide a city name.') } _callBackend() { this.setState({ error: '', }) try { this._validate() } catch (err) { return this.setState({ error: err.message }) } axios .delete('/api/city') .then(result => { // - , }) .catch(err => { if (err.response.data.error === 'GENERIC') { this.props.setError(err.response.data.description) } else { this.setState({ error: err.response.data.description, }) } }) } } export default SpecificErrorRequest
â
, , (
GENERIC
), , . , , , , , , , , . .
ãŸãšã
Webã¢ããªã±ãŒã·ã§ã³ã§ãšã©ãŒãåŠçããæ¹æ³ãçè§£ããŠããã ããããšãé¡ã£ãŠããŸãããã®ãããªãã®console.error(err)
ã¯ããããã°ç®çã§ã®ã¿äœ¿çšããå¿
èŠããããŸããããã°ã©ããŒãå¿ãããã®ã¯ãæ¬çªç°å¢ã«äŸµå
¥ããªãã§ãã ãããloglevelã®ãããªé©åãªã©ã€ãã©ãªã䜿çšããŠããã®ã³ã°ã®åé¡ã®è§£æ±ºãç°¡çŽ åããŸãã芪æãªãèªè
ïŒ ãããžã§ã¯ãã®ãšã©ãŒãã©ã®ããã«åŠçããŸããïŒ