最近写了一个播放背景音乐的程序段. mediaplayer经常要被打断,或者要读取下一首歌曲,如果再没有歌曲名的情况下play了,就会报错,我也是头一次用异常处理,结果写了一大堆代码,很麻烦. 以下是其中一段,勉强不保错了(试验了12小时),请高手指点,看有没有冗余的地方.procedure TForm1.BJWAVTimer(Sender: TObject); VAR WAVFILE:STRING; begin IF ((MEDIAPLAYER1.Mode =mpStopped) AND (WAVPAUSE=false)) OR (MEDIAPLAYER1.FileName ='') THEN BEGIN //showmessage('dds'); WAVFILE:=MYINIFILE.ReadString('音乐',INTTOSTR(WAV_NO),'0'); IF (WAVFILE<>'0') AND (WAVFILE<>'') THEN BEGIN try MEDIAPLAYER1.FileName :=WAVFILE; MEDIAPLAYER1.Open; except on EMCIDeviceError do begin try mediaplayer1.FileName :=''; except end; end; end; TRY MEDIAPLAYER1.Play ; EXCEPT ON E:EXCEPTION DO BEGIN IF E.Message ='No MCI Device Open' then begin mediaplayer1.FileName :=''; wav_no:=-1; end; END; END; WAV_NO:=WAV_NO+1; END ELSE BEGIN WAV_NO:=0; END; END; end;
还有,如果你这条语句有错了, MEDIAPLAYER1.FileName :=WAVFILE; MEDIAPLAYER1.Open; 下面的MEDIAPLAYER1.play还有意义吗,不是一样的报错?还不如合在一起procedure TForm1.BJWAVTimer(Sender: TObject); VAR WAVFILE:STRING; begin IF ((MEDIAPLAYER1.Mode =mpStopped) AND (WAVPAUSE=false)) OR (MEDIAPLAYER1.FileName ='') THEN BEGIN //showmessage('dds'); WAVFILE:=MYINIFILE.ReadString('音乐',INTTOSTR(WAV_NO),'0'); IF (WAVFILE<>'0') AND (WAVFILE<>'') THEN BEGIN try MEDIAPLAYER1.FileName :=WAVFILE; MEDIAPLAYER1.Open; MEDIAPLAYER1.Play ; EXCEPT .... end; END ELSE BEGIN WAV_NO:=0; END; end; end;
try
mm.create(..);
...
finally
mm.free;
...
end;
1。try
.....(正常处理)
except
.....(发生异常处理)
end;2。 try
......(正常处理)
finall
.....(最后处理)3。try
......正常处理1)
try
.......正常处理2)
except
.......异常处理1
end;
expect
.......异常处理2
end;4。try
try
finall
end;
finall
end;
5.try
......
try
........
except
........
end;
........
finally
........
end;
mediaplayer经常要被打断,或者要读取下一首歌曲,如果再没有歌曲名的情况下play了,就会报错,我也是头一次用异常处理,结果写了一大堆代码,很麻烦.
以下是其中一段,勉强不保错了(试验了12小时),请高手指点,看有没有冗余的地方.procedure TForm1.BJWAVTimer(Sender: TObject);
VAR WAVFILE:STRING;
begin IF ((MEDIAPLAYER1.Mode =mpStopped) AND (WAVPAUSE=false)) OR (MEDIAPLAYER1.FileName ='') THEN
BEGIN
//showmessage('dds');
WAVFILE:=MYINIFILE.ReadString('音乐',INTTOSTR(WAV_NO),'0');
IF (WAVFILE<>'0') AND (WAVFILE<>'') THEN
BEGIN
try
MEDIAPLAYER1.FileName :=WAVFILE;
MEDIAPLAYER1.Open;
except
on EMCIDeviceError do
begin
try
mediaplayer1.FileName :='';
except
end;
end;
end;
TRY
MEDIAPLAYER1.Play ;
EXCEPT
ON E:EXCEPTION DO
BEGIN
IF E.Message ='No MCI Device Open' then
begin
mediaplayer1.FileName :='';
wav_no:=-1;
end;
END;
END;
WAV_NO:=WAV_NO+1;
END ELSE
BEGIN
WAV_NO:=0;
END;
END;
end;
try
....
except
....
end;try
....
finally
....
end;
begin
try
mediaplayer1.FileName :='';
except
end;
end;
这里面的type..except..end就不需要了吧
--异常处理岂不是画蛇添足么?
--你能保证你的程序在任何情况下的不出错么?
--不能!
--所以,你需要异常处理。
>>>很好!!!!!!
MEDIAPLAYER1.FileName :=WAVFILE;
MEDIAPLAYER1.Open;
下面的MEDIAPLAYER1.play还有意义吗,不是一样的报错?还不如合在一起procedure TForm1.BJWAVTimer(Sender: TObject);
VAR
WAVFILE:STRING;
begin
IF ((MEDIAPLAYER1.Mode =mpStopped) AND (WAVPAUSE=false)) OR
(MEDIAPLAYER1.FileName ='') THEN
BEGIN
//showmessage('dds');
WAVFILE:=MYINIFILE.ReadString('音乐',INTTOSTR(WAV_NO),'0');
IF (WAVFILE<>'0') AND (WAVFILE<>'') THEN
BEGIN
try
MEDIAPLAYER1.FileName :=WAVFILE;
MEDIAPLAYER1.Open;
MEDIAPLAYER1.Play ;
EXCEPT
....
end;
END
ELSE BEGIN
WAV_NO:=0;
END;
end;
end;
我知道我为什么那么写了,原因是我调试时,只要发现错误,就报错,而不是跳过去(编译完了运行就不这样),我就以为1条try语句 只管一句呢,本来想上这里来问的了,后来看到有人先发贴了,就没问.