Exceptions
์๋ฏธ: exceptions๋ ์์์น ๋ชปํ ์ผ์ด ๋ฐ์ํ์์ ๋ํ๋ด๋ ์ค๋ฅ์ด๋ค.
๊ธฐ๋ฅ: dart code๋ exceptions๋ฅผ throw ํ๊ณ catchํ ์ ์๋ค.
ํน์ง: dart๋ exception๊ณผ error types๋ฅผ ์ ๊ณตํ์ง๋ง, null์ด ์๋ ๊ฐ์ฒด๋ง throw ํ ์ ์๋ค.
exceptions๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด ์์์ผ ํ๋ ์ฉ์ด
throw
exception๋ฐ์ ์ ๊ฐ์ฒด ๋๋ ์ฝ๋ ๋ฑ์ ๋ฐํํ ์ ์๋ค.
//์ผ๋จ ์๋ฌ๋ฅผ ๋์ ธ๋ณธ๋ค๊ณ ์๊ฐ
throw ์ฌ์ฉ ์ฝ๋ ์)
//example 1
throw FormatException('Expected at least 1 section');
//example 2
throw 'Out of llamas!';
example 1 ์ฌ์ฉ์ ๊ถ์ฅํ๋ค.
- ์๋ฌ ํ์
์ ๋ํ๋ด๋ implemeter ์ฌ์ฉํ๋ ๊ฒ ๊ถ์ฅ.
why?
implemeter์ ๋ค์ํ exception๊ณผ error์ ์ข
๋ฅ๊ฐ ์๊ธฐ ๋๋ฌธ.
catch
catch๋ ๋ค์ํ exception์ํฉ์ ์ ์ํด์ ํน์ ์ํฉ์ ์๋ฌ ์ํฉ์ ์ ์ดํ๋ค.
-> ์์ธ๋ฅผ ๋ค์ ๋ฐ์์ํค์ง ์๋ ํ ์์ธ๊ฐ ์ ํ๋์ง ์๋๋ค.
//exception์ catch ํ๋ค๊ณ ์ดํดํจ
catch๋ฌธ์ ์ฌ๋ฌ ๊ฐ ์ฐ๋ฉด ๋ค์ํ ์ข
๋ฅ์ ์๋ฌ ์ํฉ ์ ์ด ๊ฐ๋ฅํ๋ค.
์ค๋ฅ ์ํฉ ์์ on์ ์ฐ๊ฑฐ๋, catch๋ฅผ ์ฌ์ฉํ๋ค.
<์์์ฝ๋1>
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}
//OutofLiamasException์ด๋ผ๋ ์ค๋ฅ๊ฐ ์๊ธฐ๋ฉด buyMoreLlamas()์คํ.
<์์์ฝ๋2>
try {
breedMoreLlamas();
} on OutOfLlamasException {
// ์ง์ ํด๋ ํน์ ์ค๋ฅ ์ํฉ(OutOfLlamas๋ผ๋ ์ค๋ฅ ์ํฉ) ์ฒ๋ฆฌ
buyMoreLlamas();
} on Exception catch (e) {
// exception ํ์
์ผ๋ก ์ง์ ํ ์ค๋ฅ ์ฒ๋ฆฌ
// (์์ ์ ์ธํ OutOfLlamasException๋ ์ ์ธ)
print('Unknown exception: $e');
} catch (e) {
// ํ์
์ด ํน์ ํ๊ฒ ์ง์ ๋์ง ์์ ๋๋จธ์ง ์ค๋ฅ ์ฒ๋ฆฌ
print('Something really unknown: $e');
}
//ํ ๊ฒฝ์ฐ์ฉ ์์์๋ถํฐ ๊ฑธ๋ฌ์ ๋ด๋ ค์จ๋ค๊ณ ์๊ฐ
rethrow
rethrow๋ ์ค๋ฅ๋ฅผ ์ฌ์ ํํ๋ค. ํจ์์ ์ค๋ฅ๋ฅผ ๋ณผ ์ ์๊ฒ ํ๊ธฐ ์ํด์ ์ฌ์ ํ ํ๋ ๊ฒ์ด๋ค.
์์ธ๋ฅผ ์์ ํ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
<์์์ฝ๋>
void misbehave() {
try {
dynamic foo = true;
print(foo++); // ๋ง์ฝ ์ฌ๊ธฐ์ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฌ๋ค๋ฉด
} catch (e) { // ์ฌ๊ธฐ์ ์ค๋ฅ๋ฅผ catchํ๊ณ ,
print('misbehave() partially handled ${e.runtimeType}.');
rethrow; // callํ ํจ์(ํด๋น ์์์์๋ mainํจ์)๊ฐ ์ด ์ค๋ฅ ๋ณผ ์ ์๋๋ก ์ฌ์ ํ
}
}
void main() {
try {
misbehave(); // rethrow๋ก ์์์ ์ฐพ์ ์๋ฌ๊ฐ ์ฌ์ ํ๋์ด ๋ฐ์.
} catch (e) { // ์๋ฌ๋ฅผ catch
print('main() finished handling ${e.runtimeType}.');
}
}
finally
finally๋ ์์ธ ๋ฐ์์ ์ฌ๋ถ์ ๊ด๊ณ ์์ด ์ผ๋ถ ์ฝ๋๊ฐ ์คํ๋๊ฒ ํ ๋ ์ฌ์ฉํ๋ค.
finally๋ ํฌ๊ฒ ๋ ๊ฐ์ง ์ํฉ์ผ๋ก ๋๋๋ค.
1. catch๊ฐ ์๋ ๊ฒฝ์ฐ
์๋ฌ ์ํฉ์ ์๋ง๋ catch๋ฌธ์ด ์์ผ๋ฉด, catch๋ฌธ์ ๋จผ์ ์คํํ๊ณ finally ์คํ
์คํ ์์: catch๋ฌธ -> finally
<์์์ฝ๋>
try {
breedMoreLlamas();
} catch (e) {
print('Error: $e'); // ์๋ฌ๋ฅผ ๋จผ์ ์ ์ดํ๋ค.
} finally {
cleanLlamaStalls(); // ๊ทธ ๋ค์, ํจ์๋ฅผ ์คํํ๋ค.
}
2. catch๊ฐ ์๋ ๊ฒฝ์ฐ
์๋ฌ ์ํฉ์ ์๋ง๋ catch๋ฌธ์ด ์์ผ๋ฉด exception์ด ์์ด๋ finally๋ฅผ ์คํํ๋ค.
์คํ ์์: finally -> exception
<์์์ฝ๋>
try {
breedMoreLlamas();
} finally {
// ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์๋ ํธ์ถ๋ ํจ์ ์คํ
cleanLlamaStalls();
//catch๋ฌธ์ด ์์ผ๋ฏ๋ก ์๋ฌ๊ฐ ์ฌ์ ํ ๋๋ค.
}
exception code example
typedef VoidFunction = void Function();
class ExceptionWithMessage {
final String message;
const ExceptionWithMessage(this.message);
}
// Call logException to log an exception, and doneLogging when finished.
abstract class Logger {
void logException(Type t, [String? msg]);
void doneLogging();
}
void tryFunction(VoidFunction untrustworthy, Logger logger) {
// Invoking this method might cause an exception. Catch and handle
// them using try-on-catch-finally.
untrustworthy();
}
solution code
typedef VoidFunction = void Function();
class ExceptionWithMessage {
final String message;
const ExceptionWithMessage(this.message);
}
// Call logException to log an exception, and doneLogging when finished.
abstract class Logger {
void logException(Type t, [String? msg]);
void doneLogging();
}
void tryFunction(VoidFunction untrustworthy, Logger logger) {
// Invoking this method might cause an exception. Catch and handle
// them using try-on-catch-finally.
try {
untrustworthy();
} on ExceptionWithMessage catch (e) {
logger.logException(e.runtimeType, e.message);
} on Exception {
logger.logException(Exception);
} finally {
logger.doneLogging();
}
}
์ฐธ๊ณ ์ฌ์ดํธ1: https://m.blog.naver.com/mingdyuo/221803704762
์ฐธ๊ณ ์ฌ์ดํธ2: https://dart.dev/codelabs/dart-cheatsheet#initializer-lists