2015-02-01 2 views
1

"Throwable 클래스에서 상속 된 형식 만 throw 할 수 있습니다." 아무도 나에게 설명 할 수 없었어. 왜 이 아닌데 모든 유형을 던질 수 있습니까? doc에 함수에 대한 언급이 예외를 throw 할 수 있다면 예외가 없다는 의미일까요?모든 유형이 예외를 던지지 않는 이유는 무엇입니까?

예를 들어 다음 try-catch 블록이 작동한다고 생각했습니다. 그러나 그렇지 않습니다.

(((((((((
[email protected]:\D\dmd2\windows\bin\..\..\src\phobos\std\array.d(73 
9): Attempting to fetch the front of an empty array of DateTime 
---------------- 
0x0051C4C9 in _d_assert_msg 
0x00468E78 in pure nothrow ref @property @nogc @safe std.datetime.DateTime std.r 
ange.__T11SortedRangeTAS3std8datetime8DateTimeS473app19StackOverflowParser5parse 
MFAyaZ9__lambda2Z.SortedRange.front() at C:\D\dmd2\windows\bin\..\..\src\phobos\ 
std\range.d(8418) 
0x0044F908 in void app.StackOverflowParser.parse(immutable(char)[]) at D:\code\T 
rendoMetr\source\app.d(173) 
0x0044F700 in app.StackOverflowParser app.StackOverflowParser.__ctor(app.DBConne 
ct) at D:\code\TrendoMetr\source\app.d(150) 
0x0044F199 in _Dmain at D:\code\TrendoMetr\source\app.d(33) 
0x0052EDCA in D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv 
0x0052ED9F in void rt.dmain2._d_run_main(int, char**, extern (C) int function(ch 
ar[][])*).runAll() 
0x0052ECB5 in _d_run_main 
0x00470198 in main 
0x005667D1 in mainCRTStartup 
0x76D1336A in BaseThreadInitThunk 
0x772A9F72 in RtlInitializeExceptionChain 
0x772A9F45 in RtlInitializeExceptionChain 
Error executing command run: Program exited with code 1 

가이 코드에서 예외를 던질 수있는 방법 :

try 
    { 
     writeln("((((((((("); 
     latestdtonpage = dts.sort!((a,b) => a>b).front; //latest date-time. from page. 
    } 
    catch(Exception e) 
     { 
      writeln("Can't select the latest Date from parsed date"); 
      writeln(e); 
     } 

그러나 출력 예외의 경우는 (예외 텍스트) 다음입니까?

답변

10

코드가 AssertError인데 이는 dts.sort!((a,b) => a>b)이 비어 있음을 나타내며 .front으로 전화하면 안됩니다. 대신, .empty을 먼저 쿼리하고 사실 일 때 그에 따라 행동하십시오.

AssertErrorThrowable에서 차례로 상속되지만 Exception에서는 상속받지 않습니다. Error에서 상속합니다. 그래서 catch(Exception e)은 그것을 잡지 않습니다. 그리고 어쨌든 Error을 잡아서는 안되며 프로그램이 복구 할 수없는 오류 상태임을 나타냅니다.

AssertError은 특히 프로그램의 논리 버그를 알립니다. 여기 : .front을 빈 범위로 호출하십시오. AssertError을 잡지 말고 대신 코드를 수정하십시오.

관련 문제