出于学习目的,我制作了通过网络发送文件的应用程序(对我来说效果很好)。在这里,我将发布代码的主要部分,实际发送字节的代码,我认为这就足够了。
我的主要问题是:我应该何时、何地、为什么以及如何检查错误?(看起来不止一个问题:))
正如你所看到的,我通过检查每个可以警告我的函数的返回值来检查错误(我用数字标记了每一个检查,以便那些想要帮助回答和解释的人更容易)。
这是必要的吗?因为它可以显着扩展代码。
第二个问题:这是我做的好吗,有更好的方法吗?
while(!file->atEnd()){
if(isCancelled())//this is in a thread, and there is mechanism to cancel it
return;
if((readed = file->read(inter_buffer,BUFLEN)) == -1){ //1 <- marking check with "1"
emit errorOccurred(tr("Error while reading file."));
return;
}
if(socket->write(inter_buffer,readed) == -1){//2 QTcpSocket::write
emit errorOccurred(tr("Unable to send data. Probably the other side cancelled or there are connection problems."));
qDebug() << socket->error();
return;
}
rsofar += readed;
if(!socket->flush()){//3
emit errorOccurred(tr("Unable to send data. Probably the other side cancelled or there are connection problems."));
return;
}
//emit signal to inform GUI thread about progress
emit updateProgress((int)(((double)rsofar)/(double)filesize * 100.0));
if(!socket->waitForBytesWritten()){//4
//maybe this is not the right message, but that is not important now
emit errorOccurred(tr("Unable to send data. Probably the other side cancelled or there are connection problems."));
return;
}
}
第三个问题是:在 Java 中,我会依靠异常来处理这类问题。为什么 Qt 函数不会抛出异常?是因为它对于 C++ 来说被认为很慢(因为堆栈展开),或者只是在 C++ 中编程时的坏习惯,还是因为它不能很好地处理信号和插槽,或者其他什么?