API Basic Try ko - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
Try / Catch / Finally / Throw
ClassicUO โข Basic
Try๋ ๋ณธ๋ฌธ๊ณผ ํธ์ถํ ํจ์์ ์คํ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. Catch๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ๊ณ Finally๊ฐ ๋ง๋ฌด๋ฆฌ๋ฅผ ์ํํ๋ฉฐ Throw๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ฑฐ๋ ๋ค์ ๋์ง๋๋ค. API์ 0 ๋๋ false๋ ์ผ๋ฐ ๋ฐํ๊ฐ์ด๋ฏ๋ก ๋ช ์์ ์ผ๋ก ๊ฒ์ฌํด์ผ ํฉ๋๋ค. ์๋์ผ๋ก Catch์ ๋ค์ด๊ฐ์ง๋ ์์ต๋๋ค.
์ ํํ ๊ตฌ๋ฌธ
Try
statements
Catch
handlerStatements
Finally
cleanupStatements
End Try
Catch name
Catch name As Exception
Catch name As String
Throw stringExpression
Throw
๋งค๊ฐ๋ณ์
Try / statementsโ Try์๋ ํ๋์ Catch, ํ๋์ Finally ๋๋ ๋ ๋ค์ End Try๊ฐ ํ์ํฉ๋๋ค. ์ค์ฒฉํ ์ ์์ผ๋ฉฐ ๋ณธ๋ฌธ์ด ์ ์ ์ข ๋ฃ๋๋ฉด Catch๋ฅผ ๊ฑด๋๋๋๋ค. ์ด ๋ถ๋ถ์งํฉ์ ์ฌ๋ฌ Catch, When ํํฐ, Exit Try๋ฅผ ๊ตฌํํ์ง ์์ต๋๋ค.Catch / name / As typeโ Catch ๋ณ์๋ ์๋ตํ ์ ์์ต๋๋ค. name์ ์ง์ ํ๋ฉด String ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐ์ต๋๋ค. As String์ ์ด ํํ์ ๋ํ๋ด๋ฉฐ As Exception์ ํธํ ํ๊ธฐ์ผ ๋ฟ .NET ๊ฐ์ฒด๋ ํ์ ํํฐ๊ฐ ์๋๋๋ค. ๋ค๋ฅธ ํ์์ ๊ฑฐ๋ถ๋ฉ๋๋ค. ์ ์ด๋ฆ์ ํ๋ก์์ ์ง์ญ ๋ณ์๊ฐ ๋์ด ๊ฐ์ ์ด๋ฆ์ ์ ์ญ์ ๊ฐ๋ฆฝ๋๋ค. ๊ธฐ์กด ์ง์ญ ๋ณ์์๋ ํ์/Const ๊ท์น์ ์ง์ผ ๋์ ํฉ๋๋ค. Catch๊ฐ ์คํ๋์ง ์๋ ๊ฒฝ๋ก์์๋ ํ์ํ๋ฉด Try ์์์ String์ ์ ์ธํ์ธ์.Finally / End Tryโ Catch๊ฐ ์์ผ๋ฉด Finally๋ ์ ํ ์ฌํญ์ด๊ณ ๋ณธ๋ฌธ์ด ๋น์ด ์์ด๋ ๋ฉ๋๋ค. ์ ์ ์ข ๋ฃ, ์ค๋ฅ, Return, Exit Sub/Function, ๋ฐ๊นฅ ๋ฐฉํฅ์ ๋ฐ๋ณต๋ฌธ ์ด๋ ๋ฐ GoTo๋ ๊ด๋ จ Finally๋ฅผ ์คํํฉ๋๋ค. End Try๋ ํ์์ ๋๋ค. ์คํฌ๋ฆฝํธ ์ทจ์๋ ์๋์ ์ผ๋ก Catch์ ์คํฌ๋ฆฝํธ Finally๋ฅผ ๊ฑด๋๋ฐ์ด ๊ธด๊ธ ์ ์ง๊ฐ ์ง์ฐ๋์ง ์๋๋ก ํฉ๋๋ค.Throw stringExpressionโ Throw stringExpression์ ๋ฉ์์ง๋ฅผ ํ ๋ฒ ํ๊ฐํ์ฌ ์ ์คํฌ๋ฆฝํธ ์ค๋ฅ๋ฅผ ๋ง๋ญ๋๋ค. String์ด ํ์ํ๋ฉฐ ๋ค๋ฅธ ๊ฐ์ CStr๋ก ๋ช ์์ ์ผ๋ก ๋ณํํ์ธ์. ์ด๋ Basic ํ์์ด๋ฉฐ VB.NET์ Throw New Exception(...)์ด ์๋๋๋ค. ์ฒ๋ฆฌ๊ธฐ๊ฐ ์์ผ๋ฉด ํ์ฌ ์คํ์ด ์คํจํ๊ณ ๋ค๋ฅธ ๋ชจ๋ ์คํฌ๋ฆฝํธ๊ฐ ์ ์งํ๋ ๊ฒ์ ์๋๋๋ค.Throwโ ๋ฉ์์ง ์๋ Throw๋ Catch์ ๊ทธ ์์ ์ค์ฒฉ ๋ธ๋ก์์๋ง ์ธ ์ ์์ต๋๋ค. ์๋ ๋ฉ์์ง, ํ์ผ, ์ค์ ์ ์งํ๋ฉฐ ํ์ฑ ์ค๋ฅ๋ฅผ ๋ค์ ๋์ง๋๋ค. Catch์์ ํธ์ถํ ๋์ฐ๋ฏธ ํจ์๋ ์ด ํ์์ ์ฐ๋ ค๋ฉด ์์ฒด Catch๊ฐ ์์ด์ผ ํฉ๋๋ค.
๋ฐํ๊ฐ
Try/Catch/Finally์ Throw๋ ID, ์ซ์, Boolean์ ๋ฐํํ์ง ์์ต๋๋ค. Catch๋ name์ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ๋ฉฐ Throw๋ ๊ฐ์ ๋ฐํํ์ง ์๊ณ ์ ์ด๋ฅผ ์ฎ๊น๋๋ค. ์์ ๋ Main์์ ๋ String๊ณผ Integer 13์ ๋ช ์์ ์ผ๋ก ๋ฐํํฉ๋๋ค. ๋ด๋ถ API ํธ์ถ์ ๋ฐํ ๊ท์น์ ๊ทธ๋๋ก์ ๋๋ค.
๋์
- ์ค๋น ๋จ๊ณ๋ ๋ธ๋ก์ ๊ฒ์ฆํ๊ณ GoTo/On Error GoTo๋ก Try, Catch, Finally ์์ผ๋ก ์ง์ ํ๋ ๊ฒ์ ๊ธ์งํฉ๋๋ค. ์์ฑ๊ธฐ๋ ์ฒ๋ฆฌ๊ธฐ์ ๋ง๋ฌด๋ฆฌ ์ฃผ์๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๊ฐ ํธ์ถ์ ์์ฒด ํ์ฑ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ฉฐ ์ค๋ฅ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ํ Catch๋ก ๊ฐ๋๋ค. Catch์์ ๋ฐ์ํ ์ค๋ฅ๋ ์์ ์ Finally๋ฅผ ๊ฑฐ์ณ ๋ฐ๊นฅ ์ฒ๋ฆฌ๊ธฐ๋ก ์ ๋ฌ๋ฉ๋๋ค. ๊ตฌ์กฐ์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์์ผ๋ฉด ์ผ๋ฐ On Error ๊ท์น์ด ์ ์ฉ๋ ์ ์์ต๋๋ค.
- Finally ๋์ ๋๊ธฐ ์ค์ธ ๋ฐํ, ์ค๋ฅ, ๋ฐ๊นฅ ์ด๋์ ๋ณด๊ดํฉ๋๋ค. ์ค์ฒฉ ๋ง๋ฌด๋ฆฌ๋ ์์ชฝ์์ ๋ฐ๊นฅ์ชฝ์ผ๋ก ์คํ๋ฉ๋๋ค. Finally์ ์ ์ค๋ฅ๋ ๊ธฐ์กด ์ค๋ฅ๋ฅผ ๋์ฒดํฉ๋๋ค. Basic๋ Finally ์์ Return๊ณผ ๋ฐ๊นฅ ์ด๋๋ ํ์ฉํ๋ฉฐ ๋๊ธฐ ์ค์ธ ํ์ ์คํ์ ๋ฐ๊ฟ๋๋ค. ์ด๋ VB.NET๊ณผ ๋ค๋ฆ ๋๋ค. ๋ค์ ๋์ง๊ธฐ๋ ํธ์ถํ ๋์ฐ๋ฏธ๋ฅผ ํฌํจํด ์ต์ด ์คํจ ์์น๋ฅผ ๋ณด์กดํฉ๋๋ค.
- ์ผ์ ์ค์ง/์ ์ง ๊ฒ์ฌ๋ ์ ์ง๋ฉ๋๋ค. Try๋ ์ค๋ ๋, ์ฌ์๋, ๋๊ธฐ๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค. ์ค๋น๋ ์ฃผ์๋ฅผ ์ฌ์ฌ์ฉํ๋ฉฐ ์ผ๋ฐ ์กฐ๊ฑด์ ์์ธ ๋์ ์ง์ ๊ฒ์ฌํด์ผ ํฉ๋๋ค. ๊ธด๊ธ ์ ์ง๋ ์คํฌ๋ฆฝํธ ๋ง๋ฌด๋ฆฌ๋ฅผ ๊ฑด๋๋๋๋ค. ํธ์คํธ ์์ ์์์ ์์ง์ ๋ณ๋ ์๋ช ๊ด๋ฆฌ ๊ท์น์ ๋ฐ๋ฆ ๋๋ค.
- ์ ๋ฆฌ ํ Try๋ฅผ ๋ฒ์ด๋ ์ค๋ฅ๊ฐ ์ธ๋ถ On Error GoTo ์ฒ๋ฆฌ๊ธฐ๋ก ๊ฐ๋ฉด Resume์ ํค๋๋ถํฐ ์ ์ฒด Try๋ฅผ ์ฌ์๋ํฉ๋๋ค. Resume Next์ On Error Resume Next๋ End Try ๋ฐ๋ก ๋ค์ ๋ฌธ์ฅ์์ ๊ณ์ํฉ๋๋ค. ์๋ฃํ ์์ ์ด ๋ฐ๋ณต๋ ์ ์์ผ๋ฉฐ ์ ๋ฆฌ๋ ๋ณธ๋ฌธ ์ค๊ฐ์ผ๋ก ๋์๊ฐ์ง ์์ต๋๋ค.
์์
1. ๋งค๊ฐ๋ณ์๋ฅผ ๊ฒ์ฌํ๊ณ ๋ฉ์์ง ๋ณด๊ด
# CheckedAmount๋ Integer amount=-2๋ฅผ ByVal๋ก ๋ฐ์ต๋๋ค. ์์์ฌ์ Throw "amount must be non-negative"๊ฐ ๋ฐ์ํฉ๋๋ค. Catch๋ String์ problem์ผ๋ก ๋ฐ์ message์ ๋ณต์ฌํ๋ฉฐ As Exception์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค. Finally๋ finished=1๋ก ์ค์ ํฉ๋๋ค. Main์ "amount must be non-negative:1"์ ๋ฐํํฉ๋๋ค. ์์๊ฐ ์๋๋ฉด ์ ์ ๋ฐํํ๊ณ Catch๋ฅผ ๊ฑด๋๋๋๋ค.
Option Explicit On
Function CheckedAmount(ByVal amount As Integer) As Integer
If amount < 0 Then
Throw "amount must be non-negative"
End If
Return amount
End Function
Sub Main()
Dim message=""
Dim finished=0
Try
CheckedAmount(-2)
Catch problem As Exception
message=problem
Finally
finished=1
End Try
Return message & ":" & CStr(finished)
End Sub
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
CheckedAmount๋ Integer amount=-2๋ฅผ ByVal๋ก ๋ฐ์ต๋๋ค. ์์์ฌ์ Throw "amount must be non-negative"๊ฐ ๋ฐ์ํฉ๋๋ค. Catch๋ String์ problem์ผ๋ก ๋ฐ์ message์ ๋ณต์ฌํ๋ฉฐ As Exception์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค. Finally๋ finished=1๋ก ์ค์ ํฉ๋๋ค. Main์ "amount must be non-negative:1"์ ๋ฐํํฉ๋๋ค. ์์๊ฐ ์๋๋ฉด ์ ์ ๋ฐํํ๊ณ Catch๋ฅผ ๊ฑด๋๋๋๋ค.
2. ๋ฐ๊นฅ ์ฒ๋ฆฌ๊ธฐ๋ก ๋ค์ ๋์ง๊ธฐ
# ์์ชฝ Throw๊ฐ "missing item"์ ๋ง๋ญ๋๋ค. ์์ชฝ Catch๊ฐ trace=1๋ก ์ค์ ํ๊ณ ๋ฉ์์ง ์๋ Throw๊ฐ ๊ฐ์ ์ค๋ฅ๋ฅผ ์ ์งํฉ๋๋ค. ์์ชฝ Finally๊ฐ 2๋ฅผ ๋ถ์ด๊ณ ๋ฐ๊นฅ Catch๊ฐ outerProblem์ message์ ๋ณต์ฌํ๋ฉฐ 3์ ๋ถ์ธ ๋ค ๋ฐ๊นฅ Finally๊ฐ 4๋ฅผ ๋ถ์
๋๋ค. Main์ "1234:missing item"์ ๋ฐํํฉ๋๋ค. trace๋ ์คํ ์์์ด๋ฉฐ ์ค๋ฅ ์ฝ๋๊ฐ ์๋๋๋ค.
Option Explicit On
Sub Main()
Dim trace=0
Dim message=""
Try
Try
Throw "missing item"
Catch problem
trace=1
Throw
Finally
trace=trace*10+2
End Try
Catch outerProblem
message=outerProblem
trace=trace*10+3
Finally
trace=trace*10+4
End Try
Return CStr(trace) & ":" & message
End Sub
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
์์ชฝ Throw๊ฐ "missing item"์ ๋ง๋ญ๋๋ค. ์์ชฝ Catch๊ฐ trace=1๋ก ์ค์ ํ๊ณ ๋ฉ์์ง ์๋ Throw๊ฐ ๊ฐ์ ์ค๋ฅ๋ฅผ ์ ์งํฉ๋๋ค. ์์ชฝ Finally๊ฐ 2๋ฅผ ๋ถ์ด๊ณ ๋ฐ๊นฅ Catch๊ฐ outerProblem์ message์ ๋ณต์ฌํ๋ฉฐ 3์ ๋ถ์ธ ๋ค ๋ฐ๊นฅ Finally๊ฐ 4๋ฅผ ๋ถ์ ๋๋ค. Main์ "1234:missing item"์ ๋ฐํํฉ๋๋ค. trace๋ ์คํ ์์์ด๋ฉฐ ์ค๋ฅ ์ฝ๋๊ฐ ์๋๋๋ค.
3. ์์ํ ๋ฐ๋ณต๋ง๋ค ๋ง๋ฌด๋ฆฌํ๊ธฐ
# number๋ 1, 2, 3์ด ๋ฉ๋๋ค. total์๋ 1๋ง ๋ํฉ๋๋ค. Continue For๊ฐ 2๋ฅผ ๊ฑด๋๋ฐ๊ณ Exit For๊ฐ 3์์ ๋๋ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์์ํ ์ธ Try ๋ชจ๋ Finally๋ฅผ ์คํํ์ฌ finished=3์ด ๋ฉ๋๋ค. Main์ 1*10+3=13์ ๋ฐํํฉ๋๋ค. Finally์ ์ค๋ฅ๊ฐ ํ์์ธ ๊ฒ์ ์๋๋ฉฐ ๋ฐ๋ณต๋ฌธ ์ด๋์ ํด๋น ๋ฐ๋ณต์ ๋ง๋ฌด๋ฆฌ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.
Option Explicit On
Sub Main()
Dim total=0
Dim finished=0
For Var number=1 To 3
Try
If number=2 Then
Continue For
End If
If number=3 Then
Exit For
End If
total+=number
Finally
finished+=1
End Try
Next
Return total*10+finished
End Sub
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
number๋ 1, 2, 3์ด ๋ฉ๋๋ค. total์๋ 1๋ง ๋ํฉ๋๋ค. Continue For๊ฐ 2๋ฅผ ๊ฑด๋๋ฐ๊ณ Exit For๊ฐ 3์์ ๋๋ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์์ํ ์ธ Try ๋ชจ๋ Finally๋ฅผ ์คํํ์ฌ finished=3์ด ๋ฉ๋๋ค. Main์ 1*10+3=13์ ๋ฐํํฉ๋๋ค. Finally์ ์ค๋ฅ๊ฐ ํ์์ธ ๊ฒ์ ์๋๋ฉฐ ๋ฐ๋ณต๋ฌธ ์ด๋์ ํด๋น ๋ฐ๋ณต์ ๋ง๋ฌด๋ฆฌ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.