syntax error | runtime error | logic error | |
---|---|---|---|
원인 | 코드의 형식적 오류 | 실행 중에 예상외의 사태가 발생하여 동작이 중지됨 | 기술한 처리 내용에 논리적인 오류가 있음 |
알아 채는 방법 | 컴파일하면 에러 남 | 실행하면 도중에 강제 종료 됨 | 실행하면 예상외의 값이 나옴 |
해결 방법 | 컴파일러의 지적을 보고 수정 | 에러 | 원인을 스스로 찾아서 해결해야 함 |
assert(condition, optionalMessage);
void main() {
var i = 5;
assert(i > 0, 'A positive integer is required.');
}
// assert는 에러를 확인하는 코드를 내장하고 있다.
assert(i > 0, 'A positive integer is required.');
// 이와 반대로 throw는 에러를 확인하는 코드를 가지고 있지 않다. 그냥 프로그램의 실행만 멈춘다
throw Exception('Negative number: $num');
void main() {
var num = -5;
if (num < 0) {
throw Exception('Negative number: $num');
}
}
throw FormatException('Expected at least 1 section');
throw 'Out of llamas!';
void distanceTo(Point other) => throw UnimplementedError();
try {
// 예외가 발생할 수 있는 코드
} catch (e){
// e : 에러의 정보를 담고 있는 객체
// 예외처리를 위한 코드
}
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}
try {
breedMoreLlamas();
} on OutOfLlamasException {
// 특정한 예외
buyMoreLlamas();
} on Exception catch (e) {
// Exception 타입인 예외
print('Unknown exception: $e');
} catch (e) {
// 타입을 정하지 않은 catch 절로 모든 예외를 처리
print('Something really unknown: $e');
}
on
또는 catch
를 모두 사용할 수 있다.on
을 사용한다.catch
를 사용한다.catch()
에 하나 또는 두개의 매개변수를 전달 할 수 있다.[StackTrace]
객체)try {
// ···
} on Exception catch (e) {
print('Exception details:\n $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}
rethrow
키워드를 사용하여 에러의 전파를 허용한다.void misbehave() {
try {
dynamic foo = true;
print(foo++); // 런타임 에러
} catch (e) {
print('misbehave() partially handled ${e.runtimeType}.');
rethrow; // 호출자가 예외를 확인 할 수 있도록 허락
}
}
void main() {
try {
misbehave();
} catch (e) {
print('main() finished handling ${e.runtimeType}.');
}
}
특정 조건일 때 Exception을 반환
하면, 직접 만든 Exception을 사용할 수 있다.class UnsupportedMusicFileException implements Exception {
final String? _message;
const UnsupportedMusicFileException({
required String? message,
}) : _message = message;
String toString() {
if (_message == null) return 'UnsupportedMusicFileException';
return 'UnsupportedMusicFileException{_message: $_message}';
}
}
void main() {
UnsupportedMusicFileException exception =
UnsupportedMusicFileException(message: null);
print(exception);
}
private void loadMovies(String url, final int index) {
// retroift 생성
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API.base_url) // 기본적으로 적용되는 서버 URL (반드시 / 로 마무리)
.addConverterFactory(GsonConverterFactory.create()) // JSON 데이터를 GSON 라이브러리로 파싱하고 데이터를 Model에 자동으로 담는 converter
.build(); // build()로 생성
MovieService movieService = retrofit.create(MovieService.class);
// Retrofit 클래스로 interface 객체를 구현
Call<MovieResponse> call = movieService.getMovies(url);
// url 변수를 인수로 전달하여 movieService 개체에서 호출
// 일반 유형이 MovieResponse인 Call 개체를 반환
// Call 개체는 서버에서 영화 데이터를 가져오기 위해 실행될 비동기 요청
// Call 개체를 변수 call에 할당하여 실행 요청을 대기열에 넣고 응답을 비동기적으로 처리하는 데 사용
try {
call.enqueue(new Callback<MovieResponse>() {
@Override
public void onResponse(Call<MovieResponse> call, retrofit2.Response<MovieResponse> response) {
//progressDialog.dismiss();
if (response.isSuccessful()) { // 통신 성공했을 때
MovieResponse movieResponse = response.body();
Log.d(TAG, "body: 성공:\n" + movieResponse);
assert movieResponse != null;
Log.d(TAG, "response: 성공:\n" + movieResponse.toString());
if (movieResponse != null) {
List<Movie> movieList = movieResponse.getResults(); // 응답 내용 변수에 입력
switch (index) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
movieList1[index].addAll(movieList);
break;
}
}
} else {
// API 호출이 실패한 경우
Log.d(TAG, "onResponse: 실패");
}
}
@Override // 네트워크 오류
public void onFailure(Call<MovieResponse> call, Throwable t) {
t.printStackTrace();
Log.d(TAG, "onFailure: " + t.getMessage());
}
});
} catch (Exception e) {
Log.d(TAG, "Exception: " + e.getMessage());
}
}
try-catch
문은 try-on-catch
문이라고 한다.on
은 exception 객체가 필요없을 때 안써도 되고 catch
는 exception 객체가 필요할 때 사용한다.on-catch
구문을 사용한다.