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