2015-02-01 2 views
1

«Только типы, унаследованные от класса Throwable, могут быть выбраны». Может ли кто-нибудь объяснить мне. Почему нет каждый тип бросается? Если в doc нет упоминания о функции, это может вызвать исключение, это означает, что у него нет исключения?Почему не каждый тип - это исключения для исключения?

Например, я думал, что следующий блок try-catch будет работать. Но это не так.

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); 
     } 

Но выход в случае исключения не будет подведен (без текста исключения):

(((((((((
[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 

Как я могу бросить исключение в этом коде?

ответ

10

Ваш код выдает AssertError, указывая, что dts.sort!((a,b) => a>b) пуст, и вы не должны звонить на него .front. Вместо этого сначала запросите .empty и действуйте соответственно, когда это правда.

AssertError наследует от Error, который в свою очередь наследует от Throwable, но не от Exception. Так что catch(Exception e) не поймает его. И вы не должны поймать Error s в любом случае, так как они указывают на то, что программа находится в состоянии неустранимой ошибки.

AssertError, в частности, сигнализирует о логической ошибке в вашей программе. Здесь: вызов .front на пустом диапазоне. Не поймайте AssertError, но исправьте свой код.

Смежные вопросы