Hi, I'm Ataias Reis

Programmer, made in Brazil, Alma mater University of Brasilia

Throwing Exceptions in Cpp and the idea of a virtual method

Hi there! Well, the 30 days of code from HackerRank had some challenges that didn’t allow me to use Go and this is one of them. The idea is to create a custom exception and throw it. My choice of language was C++ and the solution is given below. Notice that not all code is mine, the IO handling was given by HackerRank (probably to force me use a class Calculator and an exception haha).

#include <cmath>
#include <iostream>
#include <exception>
#include <stdexcept>
using namespace std;

// ------------- my code ----------
class PowerException : public exception {
virtual const char* what() const throw() {
  return "n and p should be non-negative";
}
} except;

class Calculator {
public:
int power(int n, int p) {
  if (p < 0 || n < 0) {
    throw except;
  }
  return pow(n, p);
}
};
// ----------- end of my code ----------

int main() {
  Calculator myCalculator=Calculator();
  int T,n,p;
  cin>>T;
  while(T-->0) {
    if(scanf("%d %d",&n,&p)==2) {
      try{
        int ans=myCalculator.power(n,p);
        cout<<ans<<endl;
      }
      catch(exception& e) {
        cout<<e.what()<<endl;
      }
    }
  }
}

I actually had some troubles throwing the exception. My first trial was not actually defining an exception but just throwing a message throw "n and p should be non-negative". This gave me the following output

$ ./day_17
1
-1 -2
libc++abi.dylib: terminating with
  uncaught exception of type char const*
[1]    63186 abort      ./day_17

This means that initially I just threw a constant expression instead of an actual class that inherits from exception. I think I did this because I didn’t pay attention to the e.what() code. This means the exception has the method what() and surely a char const* doesn’t have this method. After fixing it, I could run the program as follows:

$ g++ -std=c++11 day_17.cpp -o day_17
$ ./day_17
# input
2 # number of cases
1 3 # case 1
-4 5 # case 2
#output
1
n and p should be non-negative

Virtual Method

A new concept for me in C++ was the one of a virtual method. A virtual method solves the problem of deciding which method runs when there are multiple implementations of it by a base class and its derived classes. In my case, the base class is exception and it has a method called what() declared as virtual. As it is virtual, I can override it in my derived class and then my implementation will be called when I do e.what() even if e is masked by type exception instead of my PowerException class. This way I don’t need to pay attention to the actual exception class, but just override the virtual method of it in the derived class.

Notes

As mentioned in one comment, there are equivalents in Java to virtual methods that I knew about but I didn’t think when writing this post. By default Java classes have only virtual methods, while in C++ the default is non-virtual.

That’s all for this post. Thanks for reading!

Tags
comments powered by Disqus