Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/viam/examples/modules/example_module.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ int MyModule::which_ = 0;

int main(int argc, char** argv) {
if (argc < 2) {
throw "need socket path as command line argument";
throw std::runtime_error("need socket path as command line argument");
}

// Use set_logger_severity_from_args to set the boost trivial logger's
Expand Down
1 change: 1 addition & 0 deletions src/viam/sdk/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ target_sources(viamsdk
# consider making all necessary runtime values a single `context` that has to
# be initialized within main before anything else happens?
registry/registry.cpp
common/exception.cpp
common/linear_algebra.cpp
common/proto_type.cpp
common/utils.cpp
Expand Down
68 changes: 68 additions & 0 deletions src/viam/sdk/common/exception.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#include <grpc/status.h>
#include <viam/sdk/common/exception.hpp>
namespace viam {
namespace sdk {

ViamException::ViamException(const std::string& what)
: std::runtime_error("ViamException: " + what), error_code_(ViamErrorCode::unknown){};

ViamException::ViamException(const std::string& type,
const ViamErrorCode& code,
const std::string& what)
: std::runtime_error("ViamException(" + type + "): " + what), error_code_(code){};

ViamException::~ViamException() = default;

ViamException::ViamException(const ::grpc::Status& status_code)
: ViamException(status_code.error_message() + " " + status_code.error_details()) {}

ViamException ViamException::from_viam_error_code(ViamErrorCode code) {
switch (code) {
case ViamErrorCode::ok: {
return ViamException(
"Ran ViamException::from_viam_error_code on an \'ok\' value. Check the code value "
"first.");
}
case ViamErrorCode::permission_denied: {
return PermissionDeniedException();
}
case ViamErrorCode::duplicate_resource: {
return DuplicateResourceException();
}
case ViamErrorCode::unimplemented: {
return UnimplementedException();
}
case ViamErrorCode::validation: {
return ValidationException();
}
case ViamErrorCode::connection: {
return ConnectionException();
}
case ViamErrorCode::unknown:
default: {
return ViamException();
}
}
}

ViamErrorCode ViamException::get_error_code() const noexcept {
return error_code_;
}

PermissionDeniedException::PermissionDeniedException(const std::string& what)
: ViamException("PermissionDenied", ViamErrorCode::permission_denied, what){};

DuplicateResourceException::DuplicateResourceException(const std::string& what)
: ViamException("DuplicateResource", ViamErrorCode::duplicate_resource, what){};

UnimplementedException::UnimplementedException(const std::string& what)
: ViamException("Unimplemented", ViamErrorCode::unimplemented, what){};

ValidationException::ValidationException(const std::string& what)
: ViamException("Validation", ViamErrorCode::validation, what){};

ConnectionException::ConnectionException(const std::string& what)
: ViamException("Connection", ViamErrorCode::connection, what){};

} // namespace sdk
} // namespace viam
69 changes: 69 additions & 0 deletions src/viam/sdk/common/exception.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#pragma once
#include <grpc/status.h>
#include <grpcpp/impl/codegen/status.h>
#include <iostream>
#include <sstream>
#include <stdexcept>
#include <string>

namespace viam {
namespace sdk {

enum class ViamErrorCode : uint8_t {
// Used to indicate no error
ok = 0,
// Default error code for ViamException
unknown = 1,
permission_denied = 2,
duplicate_resource = 3,
unimplemented = 4,
validation = 5,
connection = 6
};

class ViamException : public std::runtime_error {
public:
explicit ViamException(const std::string& what = "unknown");

explicit ViamException(const std::string& type,
const ViamErrorCode& code,
const std::string& what);

explicit ViamException(const ::grpc::Status& status_code);

static ViamException from_viam_error_code(ViamErrorCode code);

virtual ~ViamException();

ViamErrorCode get_error_code() const noexcept;

private:
ViamErrorCode error_code_;
};

class PermissionDeniedException : public ViamException {
public:
explicit PermissionDeniedException(const std::string& what = "unknown");
};

class DuplicateResourceException : public ViamException {
public:
explicit DuplicateResourceException(const std::string& what = "unknown");
};

class UnimplementedException : public ViamException {
public:
explicit UnimplementedException(const std::string& what = "unknown");
};

class ValidationException : public ViamException {
public:
explicit ValidationException(const std::string& what = "unknown");
};

class ConnectionException : public ViamException {
public:
explicit ConnectionException(const std::string& what = "unknown");
};
} // namespace sdk
} // namespace viam
8 changes: 5 additions & 3 deletions src/viam/sdk/common/proto_type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <boost/variant/variant.hpp>
#include <google/protobuf/struct.pb.h>

#include <viam/sdk/common/exception.hpp>
#include <viam/sdk/config/resource.hpp>

namespace viam {
Expand Down Expand Up @@ -127,7 +128,7 @@ Value ProtoType::proto_value() {
break;
}
default: {
throw std::runtime_error(
throw ViamException(
"Invalid proto_value conversion type. This should never happen;\
please file a bug report.");
}
Expand Down Expand Up @@ -190,8 +191,9 @@ bool operator==(const ProtoType& lhs, const ProtoType& rhs) {
return std::equal(lhs_vec.begin(), lhs_vec.end(), rhs_vec.begin(), rhs_vec.end(), pred);
}
default: {
throw "Invalid proto_value conversion type. This should never happen;\
please file a bug report.";
throw ViamException(
"Invalid proto_value conversion type. This should never happen;\
please file a bug report.");
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion src/viam/sdk/components/base/base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <viam/api/component/base/v1/base.grpc.pb.h>
#include <viam/api/component/base/v1/base.pb.h>

#include <viam/sdk/common/exception.hpp>
#include <viam/sdk/common/utils.hpp>
#include <viam/sdk/components/base/client.hpp>
#include <viam/sdk/components/base/server.hpp>
Expand Down Expand Up @@ -32,7 +33,7 @@ std::shared_ptr<ResourceRegistration> Base::resource_registration() {
const google::protobuf::ServiceDescriptor* sd =
p->FindServiceByName(viam::component::base::v1::BaseService::service_full_name());
if (!sd) {
throw std::runtime_error("Unable to get service descriptor for the base service");
throw ViamException("Unable to get service descriptor for the base service");
}
return std::make_shared<BaseRegistration>(sd);
}
Expand Down
15 changes: 8 additions & 7 deletions src/viam/sdk/components/base/client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <viam/api/common/v1/common.pb.h>
#include <viam/api/component/base/v1/base.grpc.pb.h>

#include <viam/sdk/common/exception.hpp>
#include <viam/sdk/common/linear_algebra.hpp>
#include <viam/sdk/common/utils.hpp>
#include <viam/sdk/components/base/base.hpp>
Expand All @@ -35,7 +36,7 @@ void BaseClient::move_straight(int64_t distance_mm, double mm_per_sec) {

const grpc::Status status = stub_->MoveStraight(&ctx, request, &response);
if (!status.ok()) {
throw std::runtime_error(status.error_message());
throw ViamException(status);
}
}

Expand All @@ -51,7 +52,7 @@ void BaseClient::spin(double angle_deg, double degs_per_sec) {

const grpc::Status status = stub_->Spin(&ctx, request, &response);
if (!status.ok()) {
throw std::runtime_error(status.error_message());
throw ViamException(status);
}
}

Expand All @@ -67,7 +68,7 @@ void BaseClient::set_power(const Vector3& linear, const Vector3& angular) {

const grpc::Status status = stub_->SetPower(&ctx, request, &response);
if (!status.ok()) {
throw std::runtime_error(status.error_message());
throw ViamException(status);
}
}

Expand All @@ -83,7 +84,7 @@ void BaseClient::set_velocity(const Vector3& linear, const Vector3& angular) {

const grpc::Status status = stub_->SetVelocity(&ctx, request, &response);
if (!status.ok()) {
throw std::runtime_error(status.error_message());
throw ViamException(status);
}
}

Expand All @@ -101,7 +102,7 @@ grpc::StatusCode BaseClient::stop() {

const grpc::Status status = stub_->Stop(&ctx, request, &response);
if (!status.ok()) {
throw std::runtime_error(status.error_message());
throw ViamException(status);
}
return status.error_code();
}
Expand All @@ -116,7 +117,7 @@ bool BaseClient::is_moving() {

const grpc::Status status = stub_->IsMoving(&ctx, request, &response);
if (!status.ok()) {
throw std::runtime_error(status.error_message());
throw ViamException(status);
}
return response.is_moving();
}
Expand All @@ -133,7 +134,7 @@ AttributeMap BaseClient::do_command(AttributeMap command) {

const grpc::Status status = stub_->DoCommand(&ctx, request, &response);
if (!status.ok()) {
throw std::runtime_error(status.error_message());
throw ViamException(status);
}
return struct_to_map(response.result());
}
Expand Down
7 changes: 4 additions & 3 deletions src/viam/sdk/components/board/board.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <viam/api/component/board/v1/board.grpc.pb.h>
#include <viam/api/component/board/v1/board.pb.h>

#include <viam/sdk/common/exception.hpp>
#include <viam/sdk/common/utils.hpp>
#include <viam/sdk/components/board/client.hpp>
#include <viam/sdk/components/board/server.hpp>
Expand Down Expand Up @@ -32,7 +33,7 @@ std::shared_ptr<ResourceRegistration> Board::resource_registration() {
const google::protobuf::ServiceDescriptor* sd =
p->FindServiceByName(viam::component::board::v1::BoardService::service_full_name());
if (!sd) {
throw std::runtime_error("Unable to get service descriptor for the board service");
throw ViamException("Unable to get service descriptor for the board service");
}
return std::make_shared<BoardRegistration>(sd);
}
Expand Down Expand Up @@ -74,7 +75,7 @@ Board::power_mode Board::from_proto(viam::component::board::v1::PowerMode proto)
}
case viam::component::board::v1::POWER_MODE_UNSPECIFIED:
default: {
throw std::runtime_error("Invalid proto board power_mode to decode");
throw ViamException("Invalid proto board power_mode to decode");
}
}
}
Expand Down Expand Up @@ -112,7 +113,7 @@ viam::component::board::v1::PowerMode Board::to_proto(Board::power_mode power_mo
return viam::component::board::v1::POWER_MODE_OFFLINE_DEEP;
}
default: {
throw std::runtime_error("Invalid board power_mode to encode");
throw ViamException("Invalid board power_mode to encode");
}
}
}
Expand Down
Loading