Error Handling

in React

Hong Shik Branden Kim

Contents

  • Why Error Handling ?

  • What is Error Handling?

  • What is Error (to handle) ?

  • How to handle Error ?

    • Type Checking
    • Conditional Rendering
    • Error Boundary
    • Good Old try ... catch

Why Error Handling?

Why Error Handling?

๐Ÿ‘ฉโ€๐Ÿ’ปย 

ํ”„๋ก ํŠธ์•ค๋“œ๋Š” ์™„๋ฒฝํ•ด์š”!

Why Error Handling?

๐Ÿ‘ฉโ€๐Ÿ’ปย 

ํ”„๋ก ํŠธ์•ค๋“œ๋Š” ์™„๋ฒฝํ•ด์š”!

์„œ๋ฒ„๊ฐ€ ์˜ค๋Š˜ ์•„ํŒŒ์š”..

Why Error Handling?

๐Ÿ‘ฉโ€๐Ÿ’ปย 

ํ”„๋ก ํŠธ์•ค๋“œ๋Š” ์™„๋ฒฝํ•ด์š”!

์„œ๋ฒ„๊ฐ€ ์˜ค๋Š˜ ์•„ํŒŒ์š”..

TRUNCATE TABLE *;

Why Error Handling?

์„œ๋ฒ„๊ฐ€ ์˜ค๋Š˜ ์•„ํŒŒ์š”..

TRUNCATE TABLE *;

Why Error Handling?

์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด๋„,ย 

๊ธฐ์กด UI๋ฅผ ํ•ด์น˜์ง€ ์•Š๊ณ  / ์„œ๋ฒ„ ์ž‘๋™์„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ 

์ฝ”๋“œ๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค !

Why Error Handling?

Morris worm

ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ

ย 

ย 

... ํ™•์ธ์ด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ

๋‹ค์‹œ ํ™•์ธ

ย 

ย 

1,000,000 $ LOSS

Why Error Handling?

์—๋Ÿฌ ํ•ธ๋“ค๋ง์€

  • ์˜๋„์น˜ ์•Š๊ฒŒ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๊ฐ€
  • ๊ธฐ์กด์— ์ž‘์„ฑํ•œ ์ฝ”๋“œ ์‹คํ–‰์„ ๋ง‰๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ 
  • ์—๋Ÿฌ๋ฅผ ๊ฐ€๋Šฅํ•œ ์ •ํ™•ํžˆ ๋ถ„๋ฅ˜ ๋ฐ ๋ถ„์„ํ•˜์—ฌ
  • ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์›ํ• ํžˆ ํ•˜๋Š” ๊ฒƒ

์— ์˜์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

What is Error Handling?

Error Handling

  • Known errorย 

  • Known unknown error

  • Unknown unknown error

Error Handling

๐Ÿ™

์˜ค๋น  ๋ฐฐ๊ณ ํŒŒ..

๐Ÿค”

Error Handling

Type Checking : ํ˜น์‹œ ๋ชป๋จน๋Š” ๊ฑฐ ์žˆ์–ด?
Conditional Check : ์–ด์ œ ๋ญ ๋จน์—ˆ์–ด?

๐Ÿ™…โ€โ™‚๏ธ

๐Ÿ™

์˜ค๋น  ๋ฐฐ๊ณ ํŒŒ..

Error Handling

Type Checking : ํ˜น์‹œ ๋ชป๋จน๋Š” ๊ฑฐ ์žˆ์–ด?
Conditional Check : ์–ด์ œ ๋ญ ๋จน์—ˆ์–ด?

๐Ÿ™…โ€โ™‚๏ธ

๐Ÿ™

์˜ค๋น  ๋ฐฐ๊ณ ํŒŒ..

๐Ÿ™†โ€โ™‚๏ธ

์˜ค! ๊ทธ๋Ÿผ ์šฐ๋ฆฌ ์—ฌ์น˜๋‹ˆ๊ฐ€ ์ข‹์•„ํ•˜๋˜ ๋œจ-๋ˆ ํ•œ ๊ตญ๋ฐฅ ๋จน์ž

Error Handling

๐Ÿ™…โ€โ™‚๏ธ

๋ชฐ๋ผ.. ๋ฐฐ๊ณ ํŒŒ (Error)

๐Ÿ™

Type Checking : ํ˜น์‹œ ๋ชป๋จน๋Š” ๊ฑฐ ์žˆ์–ด?
Conditional Check : ์–ด์ œ ๋ญ ๋จน์—ˆ์–ด?

๐Ÿ™

์˜ค๋น  ๋ฐฐ๊ณ ํŒŒ..

๐Ÿ™†โ€โ™‚๏ธ

์˜ค! ๊ทธ๋Ÿผ ์šฐ๋ฆฌ ์—ฌ์น˜๋‹ˆ๊ฐ€ ์ข‹์•„ํ•˜๋˜ ๋œจ-๋ˆ ํ•œ ๊ตญ๋ฐฅ ๋จน์ž

Error Handling

๐Ÿ™…โ€โ™‚๏ธ

๋ชฐ๋ผ.. ๋ฐฐ๊ณ ํŒŒ (Error)

๐Ÿ™

๐Ÿคฆโ€โ™‚๏ธ

๊ตญ๋ฐฅ ๋ง๊ณ ๋Š” ๋ผ๋ฉด ๋ฐ–์— ์—†์ง€๋งŒ, ์ด๊ฑฐ๋ผ๋„ ๋จน์„๋ ˆ?
(Error Handling)

Type Checking : ํ˜น์‹œ ๋ชป๋จน๋Š” ๊ฑฐ ์žˆ์–ด?
Conditional Check : ์–ด์ œ ๋ญ ๋จน์—ˆ์–ด?

๐Ÿ™

์˜ค๋น  ๋ฐฐ๊ณ ํŒŒ..

Error Handling

์—ฌ์ž์นœ๊ตฌ ๋งŒ๋“œ๋Š”๋ฐ ์‹คํŒจํ–ˆ๋‹ค... (SyntaxError)

๐Ÿ‘€

Error Handling

Known errorย 

๐Ÿ‘€

์—ฌ์ž์นœ๊ตฌ ๋งŒ๋“œ๋Š”๋ฐ ์‹คํŒจํ–ˆ๋‹ค... (SyntaxError)

์—ฌ์ž์นœ๊ตฌ ๋งŒ๋“œ๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ  ์‹ค์ฒœํ•œ๋‹ค

Error Handling

Known unknown errorย 

๐Ÿ™…โ€โ™‚๏ธ

Type Checking : ํ˜น์‹œ ๋ชป๋จน๋Š” ๊ฑฐ ์žˆ์–ด?
Conditional Check : ์–ด์ œ ๋ญ ๋จน์—ˆ์–ด?

๐Ÿ™†โ€โ™‚๏ธ

if (์–ด์ œ ๋จน์€๊ฑฐ === ์ผ์‹)

{ ํ›„๋ณด๊ตฐ.filter((food) => (food !== ์ผ์‹))}

์˜ค๋น  ๋ฉ‹์žˆ์–ด! ์—ญ์‹œ ๊ณฑ์ฐฝ์ด์•ผ!

๐Ÿ™

์˜ค๋น  ๋ฐฐ๊ณ ํŒŒ..

Error Handling

unknown unknown errorย 

๐Ÿ™…โ€โ™‚๏ธ

๋ชฐ๋ผ.. ๋ฐฐ๊ณ ํŒŒ (Error)

๐Ÿ™

๐Ÿคฆโ€โ™‚๏ธ

๊ตญ๋ฐฅ ๋ง๊ณ ๋Š” ๋ผ๋ฉด ๋ฐ–์— ์—†์ง€๋งŒ, ์ด๊ฑฐ๋ผ๋„ ๋จน์„๋ ˆ?
(Error Handling)

Type Checking : ํ˜น์‹œ ๋ชป๋จน๋Š” ๊ฑฐ ์žˆ์–ด?
Conditional Check : ์–ด์ œ ๋ญ ๋จน์—ˆ์–ด?

๐Ÿ™

์˜ค๋น  ๋ฐฐ๊ณ ํŒŒ..

๐Ÿ’

๋‚ด๊ฐ€ ์›ํ•˜๋˜ ๊ณฑ์ฐฝ์€ ์•„๋‹ˆ์ง€๋งŒ.. ๊ดœ์ฐฎ์•„...

Error Handling

  • Known errorย 

  • Known unknown error

  • Unknown unknown error

What is Error?
(to handle)

Examples

Error to handle

  • Known errorย 

  • Known unknown error

  • Unknown unknown error

Error to handle

Known errorย 

let word = "apple";
let word = "banana";
// ์ด์ค‘ ์„ ์–ธ ๋ถˆ๊ฐ€

Error to handle

Known unknown errorย 

function printUsername(firstName, lastName){
  // firstName๊ณผ lastName์ด ์—†๋Š” ๊ฒฝ์šฐ
  // firstName๊ณผ lastName์ด ํƒ€์ž… ๋ถˆ๋ถ„๋ช…, 
  // ๋‘˜ ์ค‘ string์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์ด์ƒํ•œ ๊ฐ’ ๋ฆฌํ„ด.
  // ์ด๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ์—๋Ÿฌ๋กœ ๊ฐ„์ฃผ,
  // ์ปค์Šคํ…€ํ•œ ์—๋Ÿฌ ์ œ์ž‘ ๊ฐ€๋Šฅ.
  return firstName + " " + lastName;
}

Error to handle

Known unknown errorย 

function printUsername(firstName, lastName){
  if (!firstName) {/* do sth */}
  else if (typeof firstName !== string)
  {/* do sth */}
  else {
    return firstName + " " + lastName;
  }
}

Error to handle

Unknown unknown errorย 

let firstName = get().parseJSON().firstName
// ์ž˜๋ชป๋œ JSON์ด ๋„˜์–ด์˜จ๋‹ค๋ฉด?

function printUsername(firstName, lastName){
  if (!firstName) {/* do sth */}
  else if (typeof firstName !== string)
  {/* do sth */}
  else {
    return firstName + " " + lastName;
  }
}

Error to handle

Unknown unknown errorย 

let firstName;
try {
  firstName = get().parseJSON().firstName
} catch (error) {
  sendLogToServer(error)
  showFallbackUI()
}

function printUsername(firstName, lastName){
  if (!firstName) {/* do sth */}
  else if (typeof firstName !== string)
  {/* do sth */}
  else {
    return firstName + " " + lastName;
  }
}

Error to handle

  • Known errorย 

  • Known unknown error

  • Unknown unknown error

How to handle error?
(in React)

How to handle error?

  • Type Checking

  • Conditional Rendering

  • Error Boundary

  • Good Old Javascript

How to handle error?

  • Type Checking

  • Conditional Rendering

  • Error Boundary

  • Good Old Javascript

How to handle error?

Type Checking

์™œ ์‰ผํ‘œ๊ฐ€ ์—†์ง€?

How to handle error?

Type Checking

class Summary extends React.Component {
  render() {
    const { totalRecovered } = this.props;

    return (
      <div>
        <div className="divValue">
         {totalRecovered.toLocaleString()}
        </div>
      </div>
    );
  }
}

How to handle error?

Type Checking

  • if ๋ฌธ ์‚ฌ์šฉ

  • prop-types ์‚ฌ์šฉ

  • flow, typescript ์‚ฌ์šฉ

How to handle error?

prop-types

Summary.propTypes = {
  totalConfirmed: PropTypes.number,
  totalDeaths: PropTypes.number,
  totalRecovered: PropTypes.number
};

How to handle error?

Conditional Checking

How to handle error?

Conditional Checking

class Component extends React.Component {
  /* ... */
  render() {
    if (data) {
      result = <Hello />
    } else {
      result = <Error />
    }
    return result
  }
}

How to handle error?

Conditional Checking

class Component extends React.Component {
  /* ... */
  render() {
    return data ? <Hello /> : <Error />
  }
}

How to handle error?

Conditional Checking

class Component extends React.Component {
  /* ... */
  render() {
    return (
      {isError && <ErrorAlert />}
      <Hello />
    ) 
    
    
  }
}

How to handle error?

Error Boundary

try...catch ์—ญํ• ์„ ํ•˜๋Š”
React Component

How to handle error?

Error Boundary

static getDerivedStateFromError

์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Error Boundary์˜ state๋ฅผ ๋ณ€๊ฒฝ

ย 

ย componentDidCatch(error, info)

์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ›„์˜ ๋™์ž‘์„ ์ˆ˜ํ–‰

ย 

render()

error state๊ฐ€ true => fallback UI

error state๊ฐ€ false => this.props.children

(์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ „๋‹ฌ)

Error Boundary

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // state๋ฅผ ๊ฐฑ์‹ ํ•˜์—ฌ ๋‹ค์Œ ๋ Œ๋”๋ง์—์„œ ๋Œ€์ฒด UI๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    // Example "componentStack":
    //   in ComponentThatThrows (created by App)
    //   in ErrorBoundary (created by App)
    //   in div (created by App)
    //   in App
    logComponentStackToMyService(info.componentStack);
  }

  render() {
    if (this.state.hasError) {
      // ๋ณ„๋„๋กœ ์ž‘์„ฑํ•œ ๋Œ€์ฒด UI๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
      return <h1>Something went wrong.</h1>;
    }

    return this.props.children;
  }
}

Error Boundary

class App extends React.Component {
  constructor(props) {
    super(props);
  }

/* ... */

  render() {
    return (
      <ErrorBoundary>
        <Header />
        <Summary />
        <Detail />
      </ErrorBoundary>
    )
  }
}

Error Boundary

class App extends React.Component {
  constructor(props) {
    super(props);
  }

/* ... */

  render() {
    return (
      <>
        <Header />
        <Summary />
        <DetailErrorBounadary>
          <Detail />
        </DetailErrorBounadary>
      </>
    )
  }
}

Good Old Javascript

Thank you!

Error Handling in React

By Hong Shik Branden Kim

Error Handling in React

  • 119